defmodule Circlex.Emulator.State.TransferState do alias Circlex.Emulator.State alias Circlex.Emulator.State.RecipientState alias Circlex.Struct.{Amount, SourceDest, Transfer} alias Circlex.Emulator.Logic.TransferLogic import State.Util def all_transfers(filters \\ []) do get_transfers_st(fn transfers -> transfers end, filters) end def get_transfer(id, filters \\ []) do get_transfers_st(fn transfers -> TransferLogic.get_transfer(transfers, id) end, filters) end def add_transfer(transfer) do update_transfers_st(fn transfers -> TransferLogic.add_transfer(transfers, transfer) end) end def update_transfer(transfer_id, f) do update_transfers_st(fn transfers -> TransferLogic.update_transfer(transfers, transfer_id, f) end) end def new_transfer(source, destination, amount, transaction_hash \\ nil) do destination = case destination.type do "verified_blockchain" -> {:ok, recipient} = RecipientState.get_recipient(destination.addressId) %{ type: "blockchain", address: recipient.address, chain: recipient.chain } _ -> destination end {:ok, %Transfer{ id: State.next(:uuid), source: SourceDest.deserialize(source), destination: SourceDest.deserialize(destination), amount: Amount.deserialize(amount), status: "pending", transaction_hash: transaction_hash, create_date: State.next(:date) }} end def deserialize(st) do %{st | transfers: Enum.map(st.transfers, &Transfer.deserialize/1)} end def serialize(st) do %{st | transfers: Enum.map(st.transfers, &Transfer.serialize/1)} end def initial_state() do %{transfers: []} end defp get_transfers_st(mfa_or_fn, filters \\ []) do State.get_st(mfa_or_fn, [:transfers], &apply_filters(&1, filters)) end defp update_transfers_st(mfa_or_fn, filters \\ []) do State.update_st(mfa_or_fn, [:transfers], &apply_filters(&1, filters)) end end