lib/mavlink/message.ex

defprotocol XMAVLink.Message do
  @spec pack(XMAVLink.Message.t(), 1 | 2) ::
          {
            :ok,
            XMAVLink.Types.message_id(),
            {
              :ok,
              XMAVLink.Types.crc_extra(),
              pos_integer,
              :broadcast | :system | :system_component | :component
            },
            binary()
          }
          | {:error, String.t()}
  def pack(message, version)
end

defimpl XMAVLink.Message,
  for: [Atom, BitString, Float, Function, Integer, List, Map, PID, Port, Reference, Tuple] do
  def pack(not_a_message, _),
    do: {:error, "pack(): #{inspect(not_a_message)} is not a MAVLink message"}
end