lib/live_view_native_swift_ui/types/shape_style/color.ex

defmodule LiveViewNativeSwiftUi.Types.Color do
  import LiveViewNativeSwiftUi.Utils, only: [encode_key: 1]

  @derive Jason.Encoder
  defstruct [
    :blue,
    :brightness,
    :green,
    :hue,
    :opacity,
    :red,
    :rgb_color_space,
    :saturation,
    :string,
    :white
  ]

  @system_colors ~w(
    black
    blue
    brown
    clear
    cyan
    gray
    green
    indigo
    mint
    orange
    pink
    purple
    red
    teal
    white
    yellow
    accent
    primary
    secondary
  )a

  @rgb_color_spaces ~w(
    srgb
    srgb_linear
    display_p3
  )a

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

  def cast(value) when is_map(value), do: {:ok, struct(__MODULE__, value)}

  def cast(value) when is_bitstring(value),
    do: {:ok, %__MODULE__{string: value}}

  def cast(value) when value in @system_colors,
    do: {:ok, %__MODULE__{string: "system-#{value}"}}

  def cast({rgb_color_space, %{white: white} = opts}) when rgb_color_space in @rgb_color_spaces,
    do: {:ok, %__MODULE__{rgb_color_space: encode_key(rgb_color_space), white: white, opacity: opts[:opacity]}}

  def cast({rgb_color_space, %{} = opts}) when rgb_color_space in @rgb_color_spaces,
    do:
      {:ok,
       %__MODULE__{
         rgb_color_space: encode_key(rgb_color_space),
         red: opts[:red],
         green: opts[:green],
         blue: opts[:blue],
         opacity: opts[:opacity]
       }}

  def cast(_), do: :error
end