defmodule Circlex.Struct.SourceDest do import Circlex.Struct.Util defstruct [:type, :id, :address, :address_tag, :chain, :address_id] def deserialize(source_dest) do case fetch(source_dest, :type) do "wire" -> %__MODULE__{ type: :wire, id: fetch(source_dest, :id) } "wallet" -> %__MODULE__{ type: :wallet, id: fetch(source_dest, :id), address: fetch(source_dest, :address) } "blockchain" -> %__MODULE__{ type: :blockchain, address: fetch(source_dest, :address), address_tag: fetch(source_dest, :addressTag), chain: fetch(source_dest, :chain) } "verified_blockchain" -> %__MODULE__{ type: :verified_blockchain, address_id: fetch(source_dest, :addressId) } end end def serialize(source_dest) do case source_dest.type do :wire -> %{ type: "wire", id: source_dest.id } :wallet -> Map.merge( %{ type: "wallet", id: source_dest.id }, if(is_nil(source_dest.address), do: %{}, else: %{address: String.downcase(source_dest.address)} ) ) :blockchain -> case source_dest.chain do "ETH" -> %{ type: "blockchain", address: String.downcase(source_dest.address), chain: source_dest.chain } _ -> %{ type: "blockchain", address: source_dest.address, chain: source_dest.chain } end :verified_blockchain -> %{ type: "verified_blockchain", addressId: source_dest.address_id } end end end