lib/live_view_native_swift_ui/types/shape_style/angular_gradient.ex

defmodule LiveViewNativeSwiftUi.Types.AngularGradient do
  @derive Jason.Encoder
  defstruct [
    :gradient,
    :start_angle,
    :end_angle,
    :angle,
    center: {0.5, 0.5}
  ]

  use LiveViewNativePlatform.Modifier.Type
  def type, do: :map

  alias LiveViewNativeSwiftUi.Types.Gradient
  alias LiveViewNativeSwiftUi.Types.UnitPoint
  alias LiveViewNativeSwiftUi.Types.Angle

  def cast(value) when is_map(value) or is_list(value) do
    with {:ok, gradient} <- Gradient.cast(value[:gradient]),
         {:ok, center} <- UnitPoint.cast(value[:center] || {0.5, 0.5})
    do
      case value[:angle] do
        nil ->
          {:ok, %__MODULE__{
            gradient: gradient,
            center: center,
            angle: nil,
            start_angle: elem(Angle.cast(value[:start_angle]), 1),
            end_angle: elem(Angle.cast(value[:end_angle]), 1)
          }}
        angle ->
          {:ok, %__MODULE__{
            gradient: gradient,
            center: center,
            angle: elem(Angle.cast(angle), 1),
            start_angle: nil,
            end_angle: nil
          }}
      end
    else
      _ ->
        :error
    end
  end

  def cast(_), do: :error
end