Packages
vtc
0.14.1
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.9
0.16.8
0.16.7
0.16.6
0.16.5
0.16.4
0.16.2
0.16.1
0.16.0
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.15
0.13.14
0.13.13
0.13.12
0.13.11
0.13.10
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.10
0.10.9
0.10.8
0.10.7
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.2
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.3
0.5.2
0.5.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
A SMPTE timecode library for Elixir
Current section
Files
Jump to
Current section
Files
lib/framestamp_mixed_rate_arithmatic_error.ex
defmodule Vtc.Framestamp.MixedRateArithmaticError do
@moduledoc """
Exception returned when mixed-rate arithmatic was attempted without specifying which
side of the operation's rate should be inherited.
## Struct Fields
- `left_rate`: The rate that was found on the left side of the operation.
- `right_rate`: The rate that was found on the right side of the operation.
"""
alias Vtc.Framerate
alias Vtc.Framestamp
alias Vtc.Source.Frames
@enforce_keys [:func_name, :left_rate, :right_rate]
defexception @enforce_keys
@typedoc """
Type of `Framestamp.MixedRateError`.
"""
@type t() :: %__MODULE__{
func_name: :add | :sub,
left_rate: Framerate.t(),
right_rate: Framerate.t()
}
@doc """
Returns a message for the error reason.
"""
@spec message(t()) :: String.t()
def message(error) do
"attempted `Framestamp.#{error.func_name}(a, b)` where `a.rate` does not match" <>
" `b.rate`. try `:inherit_rate` option to `:left` or `:right`." <>
" alternatively, do your calculation in seconds, then cast back to `Framestamp`" <>
" with the appropriate rate"
end
# Gets a the correct rate for a mixed rate operation.
@doc false
@spec get_rate(
Framestamp.t() | Frames.t(),
Framestamp.t() | Frames.t(),
Framestamp.inherit_opt(),
func_name :: atom()
) :: {:ok, Framerate.t()} | {:error, t()}
def get_rate(a, b, opt, func_name) do
with :ok <- get_rate_validate(a, b, opt, func_name) do
case {a, b, opt} do
{%Framestamp{rate: rate}, _, :left} -> {:ok, rate}
{_, %Framestamp{rate: rate}, _} -> {:ok, rate}
{%Framestamp{rate: rate}, _, _} -> {:ok, rate}
end
end
end
@spec get_rate_validate(
Framestamp.t() | Frames.t(),
Framestamp.t() | Frames.t(),
Framestamp.inherit_opt(),
func_name :: atom()
) ::
:ok | {:error, t()}
defp get_rate_validate(%Framestamp{rate: rate}, %Framestamp{rate: rate}, _, _), do: :ok
defp get_rate_validate(_, _, :left, _), do: :ok
defp get_rate_validate(_, _, :right, _), do: :ok
defp get_rate_validate(_, b, _, _) when not is_struct(b, Framestamp), do: :ok
defp get_rate_validate(a, _, _, _) when not is_struct(a, Framestamp), do: :ok
defp get_rate_validate(a, b, _, func_name),
do: {:error, %__MODULE__{func_name: func_name, left_rate: a.rate, right_rate: b.rate}}
end