Current section
Files
Jump to
Current section
Files
priv/blueprint_generator/datum.eex
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