lib/live_view_native_swift_ui/types/shape_style/image_paint.ex

defmodule LiveViewNativeSwiftUi.Types.ImagePaint do
  @derive Jason.Encoder
  defstruct [
    :image,
    :system_image,
    :source_rect,
    :scale
  ]

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

  alias LiveViewNativeSwiftUi.Types.Rect

  def cast(value) when is_map(value) or is_list(value) do
    with {:ok, source_rect} <- Rect.cast(value[:source_rect] || [x: 0, y: 0, width: 1, height: 1]) do
      case value[:image] do
        {:name, image} ->
          {:ok, %__MODULE__{
            image: image,
            system_image: nil,
            source_rect: source_rect,
            scale: value[:scale] || 1
          }}

        {:system, system_image} ->
          {:ok, %__MODULE__{
            image: nil,
            system_image: system_image,
            source_rect: source_rect,
            scale: value[:scale] || 1
          }}

        _ ->
          :error        
      end
    else
      _ ->
        :error
    end
  end

  def cast(_), do: :error
end