defmodule Stellar.TxBuild.ManageData do @moduledoc """ Sets, modifies, or deletes a Data Entry (name/value pair). """ import Stellar.TxBuild.Validations, only: [validate_optional_account: 1] alias Stellar.TxBuild.OptionalAccount alias StellarBase.XDR.{ DataValue, OperationBody, OperationType, Operations.ManageData, OptionalDataValue, String64 } @behaviour Stellar.TxBuild.XDR @type t :: %__MODULE__{ entry_name: String.t(), entry_value: String.t(), source_account: OptionalAccount.t() } defstruct [:entry_name, :entry_value, :source_account] @impl true def new(args, opts \\ []) def new(args, _opts) when is_list(args) do entry_name = Keyword.get(args, :entry_name) entry_value = Keyword.get(args, :entry_value) source_account = Keyword.get(args, :source_account) with {:ok, source_account} <- validate_optional_account({:source_account, source_account}) do %__MODULE__{ entry_name: entry_name, entry_value: entry_value, source_account: source_account } end end def new(_args, _opts), do: {:error, :invalid_operation_attributes} @impl true def to_xdr(%__MODULE__{entry_name: entry_name, entry_value: entry_value}) do entry_value = data_value_xdr(entry_value) op_type = OperationType.new(:MANAGE_DATA) entry_name |> String64.new() |> ManageData.new(entry_value) |> OperationBody.new(op_type) end @spec data_value_xdr(value :: any()) :: OptionalDataValue.t() defp data_value_xdr(nil), do: OptionalDataValue.new(nil) defp data_value_xdr(value) do value |> DataValue.new() |> OptionalDataValue.new() end end