# `HL7v2.Segment`
[🔗](https://github.com/Balneario-de-Cofrentes/hl7v2/blob/v3.10.1/lib/hl7v2/segment.ex#L1)

Base behaviour and helpers for typed HL7v2 segments.

Provides a `__using__` macro that generates struct, `parse/2`, and `encode/1`
from a declarative field definition list — zero boilerplate per segment.

## Defining a Segment

    defmodule HL7v2.Segment.MSA do
      use HL7v2.Segment,
        id: "MSA",
        fields: [
          {1, :acknowledgment_code, HL7v2.Type.ID, :r, 1},
          {2, :message_control_id, HL7v2.Type.ST, :r, 1},
          {3, :text_message, HL7v2.Type.ST, :o, 1},
          ...
        ]
    end

## Field Definitions

Each field is a tuple `{sequence, name, type, optionality, max_reps}`:

- `sequence` — 1-based field position per HL7 spec
- `name` — atom used as struct key
- `type` — type module (e.g. `HL7v2.Type.ST`) or `:raw` for pass-through
- `optionality` — `:r` (required), `:o` (optional), `:c` (conditional), `:b` (backwards-compat/withdrawn)
- `max_reps` — `1` for non-repeating, `:unbounded` or integer for repeating

# `field_def`

```elixir
@type field_def() ::
  {pos_integer(), atom(), module() | :raw, optionality(), max_reps()}
```

# `max_reps`

```elixir
@type max_reps() :: pos_integer() | :unbounded
```

# `optionality`

```elixir
@type optionality() :: :r | :o | :c | :b
```

# `encode`

```elixir
@callback encode(struct()) :: list()
```

# `fields`

```elixir
@callback fields() :: [field_def()]
```

# `parse`

```elixir
@callback parse(list(), HL7v2.Separator.t()) :: struct()
```

# `segment_id`

```elixir
@callback segment_id() :: binary()
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
