lib/sources/frames.ex

defprotocol Vtc.Source.Frames do
  @moduledoc """
  Protocol which types can implement to be passed as the main value of
  `Framestamp.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")

  - [SMPTETimecodeStr](`Vtc.Source.Frames.SMPTETimecodeStr`)

  - [FeetAndFrames](`Vtc.Source.Frames.FeetAndFrames`)
  """

  alias Vtc.Framerate
  alias Vtc.Framestamp

  @typedoc """
  Result type of `frames/2`.
  """
  @type result() :: {:ok, integer()} | {:error, Framestamp.ParseError.t()}

  @doc """
  Returns the value as a frame count.

  # Arguments

  - **value**: The source value.

  - **rate**: The framerate of the framestamp 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