defmodule TestSpec do @moduledoc false # ============================================================================ defmodule P do @moduledoc false use Etiquette.Spec packet "p" do field "x", 4 field "y", 4, id: :y field "z", (..), length_by: :y end packet "x" do field "x", 1 end end # ============================================================================ defmodule Pack do @moduledoc false use Etiquette.Spec packet "Pack", id: :pack do field "Type", 2 field "Data Length", 2, id: :length field "Data", (..), length_by: :length end end # ============================================================================ defmodule Example.Spec do @moduledoc false use Etiquette.Spec packet "Header Packet", id: :header_packet do field "Header Fixed", 1, fixed: 1, doc: "Whether the packet is a header." field "Packet Type", 2, doc: "The type of the payload. Can be any 0-3 integer." field "Type-Specific fields", (..), id: :type_specific_fields, doc: "The packet payload." end packet "Hello Packet", of: :header_packet do field "Packet Type", 2, fixed: 0b00 field "Hello-specific payload", 8, part_of: :type_specific_fields end packet "Conversation Packet", of: :header_packet do field "Packet Type", 2, fixed: 0b01 field "Conversation-specific payload", 8, part_of: :type_specific_fields end packet "Bye Packet", of: :header_packet do field "Packet Type", 2, fixed: 0b11 field "Bye-specific payload", 8, part_of: :type_specific_fields end def compile_test do is_header_packet?(<<>>) is_hello_packet?(<<>>) is_conversation_packet?(<<>>) is_bye_packet?(<<>>) parse_header_packet(<<>>) parse_hello_packet(<<>>) parse_conversation_packet(<<>>) parse_bye_packet(<<>>) build_header_packet(nil, nil) build_hello_packet(nil) build_conversation_packet(nil) build_bye_packet(nil) end end # ============================================================================ defmodule Spec do @moduledoc false use Etiquette.Spec packet "Header", id: :header do field "Type", 2 field "Data", (..) end packet "Type 0", id: :type_0, of: :header do field "Type", 2, fixed: 0b00 field "Data", (..) end packet "Type 1", id: :type_1, of: :header do field "Type", 2, fixed: 0b01 field "Data", (..) end end end