defmodule Bacen.STA.ProtocolSerializer do @moduledoc """ The Protocol message serializer. """ alias Bacen.STA.Protocol @doc """ Serliazes a Protocol message schema into tuple-formatted XML. ## Examples iex> protocol = %Bacen.STA.Protocol{ iex> parameters: %Bacen.STA.Protocol.Parameters{ iex> file_name: "202111172051.xml", iex> file_size: 908, iex> file_type: "ACCS001", iex> hash: "053c29ae8b823df65f5bff084f410ca70530c30112bc7590518fe421f4421443", iex> observation: "test", iex> senders: %Bacen.STA.Protocol.Parameters.Senders{ iex> sender: [ iex> %Bacen.STA.Protocol.Parameters.Senders.Sender{ iex> dependency: "Dependency001", iex> operator: "Operator001", iex> unity: "Unity001" iex> } iex> ] iex> } iex> } iex> } iex> Bacen.STA.ProtocolSerializer.serialize(protocol) {:Parametros, [ {:IdentificadorDocumento, ['ACCS001']}, {:Hash, ['053c29ae8b823df65f5bff084f410ca70530c30112bc7590518fe421f4421443']}, {:Tamanho, ['908']}, {:NomeArquivo, ['202111172051.xml']}, {:Observacao, ['test']}, {:Destinatarios, [ Destinatario: [ Unidade: ['Unity001'], Dependencia: ['Dependency001'], Operador: ['Operator001'] ] ]} ]} iex> protocol = %Bacen.STA.Protocol{ iex> parameters: %Bacen.STA.Protocol.Parameters{ iex> file_name: "202111172051.xml", iex> file_size: 908, iex> file_type: "ACCS001", iex> hash: "053c29ae8b823df65f5bff084f410ca70530c30112bc7590518fe421f4421443", iex> observation: nil, iex> senders: %Bacen.STA.Protocol.Parameters.Senders{ iex> sender: [ iex> %Bacen.STA.Protocol.Parameters.Senders.Sender{ iex> dependency: "Dependency001", iex> operator: "Operator001", iex> unity: "Unity001" iex> } iex> ] iex> } iex> } iex> } iex> Bacen.STA.ProtocolSerializer.serialize(protocol) {:Parametros, [ {:IdentificadorDocumento, ['ACCS001']}, {:Hash, ['053c29ae8b823df65f5bff084f410ca70530c30112bc7590518fe421f4421443']}, {:Tamanho, ['908']}, {:NomeArquivo, ['202111172051.xml']}, {:Observacao, []}, {:Destinatarios, [ Destinatario: [ Unidade: ['Unity001'], Dependencia: ['Dependency001'], Operador: ['Operator001'] ] ]} ]} iex> protocol = %Bacen.STA.Protocol{ iex> parameters: %Bacen.STA.Protocol.Parameters{ iex> file_name: "202111172051.xml", iex> file_size: 908, iex> file_type: "ACCS001", iex> hash: "053c29ae8b823df65f5bff084f410ca70530c30112bc7590518fe421f4421443", iex> observation: nil, iex> senders: %Bacen.STA.Protocol.Parameters.Senders{sender: []} iex> } iex> } iex> Bacen.STA.ProtocolSerializer.serialize(protocol) {:Parametros, [ {:IdentificadorDocumento, ['ACCS001']}, {:Hash, ['053c29ae8b823df65f5bff084f410ca70530c30112bc7590518fe421f4421443']}, {:Tamanho, ['908']}, {:NomeArquivo, ['202111172051.xml']}, {:Observacao, []}, {:Destinatarios, []} ]} """ def serialize(%Protocol{parameters: parameters = %Protocol.Parameters{}}) do {:Parametros, [ {:IdentificadorDocumento, [to_charlist(parameters.file_type)]}, {:Hash, [to_charlist(parameters.hash)]}, {:Tamanho, file_size(parameters.file_size)}, {:NomeArquivo, [to_charlist(parameters.file_name)]}, {:Observacao, observation(parameters)}, {:Destinatarios, senders(parameters)} ]} end defp file_size(size) when is_integer(size) do size = size |> to_string() |> to_charlist() [size] end defp observation(%Protocol.Parameters{observation: nil}), do: [] defp observation(%Protocol.Parameters{observation: observation}), do: [to_charlist(observation)] defp senders(%Protocol.Parameters{ senders: %Protocol.Parameters.Senders{sender: senders = [_ | _]} }) do Enum.map(senders, fn sender = %Protocol.Parameters.Senders.Sender{} -> {:Destinatario, [ {:Unidade, [to_charlist(sender.unity)]}, {:Dependencia, [to_charlist(sender.dependency)]}, {:Operador, [to_charlist(sender.operator)]} ]} end) end defp senders(%Protocol.Parameters{senders: %Protocol.Parameters.Senders{sender: _}}), do: [] end