defprotocol Vtc.Source.Frames do @moduledoc """ Protocol which types can implement to be passed as the main value of `Timecode.with_frames/2`. ## Implementations Out of the box, this protocol is implemented for the following types: - `Integer` - `String` & 'BitString' - timecode ("01:00:00:00") - integer ("86400") - Feet+Frames ("5400+00") """ alias Vtc.Framerate alias Vtc.Timecode @typedoc """ Result type of `frames/2`. """ @type result() :: {:ok, integer()} | {:error, Timecode.ParseError.t()} @doc """ Returns the value as a frame count. # Arguments - **value**: The source value. - **rate**: The framerate of the timecode being parsed. # Returns A result tuple with an integer value representing the frame count on success. """ @spec frames(t(), Framerate.t()) :: result() def frames(value, rate) end defimpl Vtc.Source.Frames, for: Integer do alias Vtc.Framerate alias Vtc.Source.Frames @spec frames(integer(), Framerate.t()) :: Frames.result() def frames(value, _rate), do: {:ok, value} end defimpl Vtc.Source.Frames, for: [String, BitString] do alias Vtc.Framerate alias Vtc.Source.Frames alias Vtc.Utils.Parse @spec frames(String.t(), Framerate.t()) :: Frames.result() def frames(value, rate), do: Parse.parse_frames_string(value, rate) end