defprotocol Vtc.Source.Seconds do
@moduledoc """
Protocol which types can implement to be passed as the main value of
`Framestamp.with_seconds/3`.
## Implementations
Out of the box, this protocol is implemented for the following types:
- `Integer`
- `Float`
- `Ratio`
- `String`
- runtime ("01:00:00.0")
- decimal ("3600.0")
- `Vtc.Source.Seconds.RuntimeStr`
- `Vtc.Source.Seconds.PremiereTicks`
"""
alias Vtc.Framerate
alias Vtc.Framestamp
@typedoc """
Result type of `seconds/2`.
"""
@type result() :: {:ok, Ratio.t()} | {:error, Framestamp.ParseError.t()}
@doc """
Returns the value as a rational, real-world seconds value.
## Arguments
- **value**: The source value.
- **rate**: The framerate of the framestamp being parsed.
## Returns
A result tuple with a rational representation of the seconds value using `Ratio` on
success.
"""
@spec seconds(t(), Framerate.t()) :: result()
def seconds(value, rate)
end