defmodule StellarBase.XDR.Thresholds do @moduledoc """ Representation of an AccountEntry's Thresholds. Thresholds stores unsigned bytes: [weight of master|low|med|high] """ alias StellarBase.XDR.Opaque4 @behaviour XDR.Declaration @type thresholds :: [ master_weight: byte(), low: byte(), med: byte(), high: byte() ] @type t :: %__MODULE__{master_weight: byte(), low: byte(), med: byte(), high: byte()} defstruct [:master_weight, :low, :med, :high] @spec new(thresholds :: thresholds()) :: t() def new(master_weight: master_weight, low: low, med: med, high: high), do: %__MODULE__{master_weight: master_weight, low: low, med: med, high: high} @impl true def encode_xdr(%__MODULE__{ master_weight: master_weight, low: low, med: med, high: high }) do <> |> Opaque4.new() |> Opaque4.encode_xdr() end @impl true def encode_xdr!(%__MODULE__{master_weight: master_weight, low: low, med: med, high: high}) do <> |> Opaque4.new() |> Opaque4.encode_xdr!() end @impl true def decode_xdr(bytes, spec \\ nil) def decode_xdr(bytes, _spec) do case Opaque4.decode_xdr(bytes) do {:ok, {%Opaque4{opaque: thresholds}, rest}} -> {:ok, {new(to_keyword_list(thresholds)), rest}} error -> error end end @impl true def decode_xdr!(bytes, spec \\ nil) def decode_xdr!(bytes, _spec) do {%Opaque4{opaque: thresholds}, rest} = Opaque4.decode_xdr!(bytes) {new(to_keyword_list(thresholds)), rest} end @spec to_keyword_list(thresholds :: binary()) :: thresholds() defp to_keyword_list(thresholds) do <> = thresholds [master_weight: master_weight, low: low, med: med, high: high] end end