defmodule Datum do @moduledoc """ Datum type for the validator. Provides encoding to Plutus data and decoding from Plutus data. """ alias Sutra.Data.Plutus.{Constr, PList} <%= if @is_enum do %> @type t() :: <%= @type_union %> <%= @variant_modules %> @doc "Returns the constructor index for a variant name" def constructor_index(name) do case name do <%= for v <- @variants do %> <%= inspect(v["title"]) %> -> {:ok, <%= v["index"] %>} <% end %> _ -> {:error, :unknown_variant} end end @doc "Returns the variant name for a constructor index" def variant_name(index) do case index do <%= for v <- @variants do %> <%= v["index"] %> -> {:ok, <%= inspect(v["title"]) %>} <% end %> _ -> {:error, :unknown_index} end end @doc "Decodes Plutus data to the appropriate variant" def from_plutus(%Constr{index: index} = data) do case index do <%= for v <- @variants do %> <%= v["index"] %> -> <%= v["title"] %>.from_plutus(data) <% end %> _ -> {:error, :unknown_constructor} end end def from_plutus(_), do: {:error, :invalid_data} <% else %> defstruct <%= inspect(@struct_fields) %> @type t() :: %__MODULE__{ <%= @field_types %> } @doc "Creates a new Datum" def new(attrs \\ %{}), do: struct(__MODULE__, attrs) @doc "Converts to Plutus data" def to_plutus(%__MODULE__{} = data) do fields = [ <%= @to_plutus_fields %> ] %Constr{index: <%= @index %>, fields: fields} end @doc "Converts from Plutus data" def from_plutus(%Constr{index: <%= @index %>, fields: field_values}) do case field_values do [<%= @field_pattern %>] -> {:ok, %__MODULE__{ <%= @from_plutus_fields %> }} _ -> {:error, :field_count_mismatch} end end def from_plutus(_), do: {:error, :invalid_data} <% end %> end