# `TimeZoneInfo.IanaParser`
[🔗](https://github.com/hrzndhrn/time_zone_info/blob/main/lib/time_zone_info/iana_parser.ex#L1)

The IANA-Parser builds the data structure for `TimeZoneInfo`.

The format of the IANA data explains the article [How to Read the tz Database
Source Files](https://data.iana.org/time-zones/tz-how-to.html)

# `data`

```elixir
@type data() :: binary()
```

The raw IANA data.

# `day`

```elixir
@type day() ::
  non_neg_integer()
  | [{:last_day_of_week, Calendar.day_of_week()}]
  | [day: Calendar.day(), op: op(), day_of_week: Calendar.day_of_week()]
```

# `op`

```elixir
@type op() :: :ge | :le
```

# `output`

```elixir
@type output() :: %{
  optional(:zones) =&gt; %{required(Calendar.time_zone()) =&gt; [zone_state()]},
  optional(:rules) =&gt; %{required(TimeZoneInfo.rule_name()) =&gt; [rule()]},
  optional(:links) =&gt; %{required(Calendar.time_zone()) =&gt; Calendar.time_zone()}
}
```

The parsed data.

# `rule`

```elixir
@type rule() :: [
  from: Calendar.year(),
  to: Calendar.year() | :only,
  in: Calendar.month(),
  on: day(),
  at: time(),
  time_standard: TimeZoneInfo.time_standard(),
  std_offset: Calendar.std_offset(),
  letters: String.t() | nil
]
```

# `time`

```elixir
@type time() :: {Calendar.hour(), Calendar.minute(), Calendar.second()}
```

# `until`

```elixir
@type until() ::
  {Calendar.year()}
  | {Calendar.year(), Calendar.month()}
  | {Calendar.year(), Calendar.month(), day()}
  | {Calendar.year(), Calendar.month(), day(), Calendar.hour()}
  | {Calendar.year(), Calendar.month(), day(), Calendar.hour(),
     Calendar.minute()}
  | {Calendar.year(), Calendar.month(), day(), Calendar.hour(),
     Calendar.minute(), Calendar.second()}
```

# `zone_state`

```elixir
@type zone_state() :: [
  utc_offset: Calendar.utc_offset(),
  rules: String.t() | integer() | nil,
  format: TimeZoneInfo.Transformer.Abbr.format(),
  until: until(),
  time_standard: TimeZoneInfo.time_standard()
]
```

# `parse`

```elixir
@spec parse(data()) :: {:ok, output()} | {:error, rest, line, byte_offset}
when rest: String.t(), line: non_neg_integer(), byte_offset: non_neg_integer()
```

Builds the data structure `IanaParser.output` from the `iana_data`.

# `parse`

```elixir
@spec parse(Path.t(), String.t()) ::
  {:ok, output()} | {:error, rest, line, byte_offset}
when rest: String.t(), line: non_neg_integer(), byte_offset: non_neg_integer()
```

Builds the data structure `IanaParser.output` from the IANA data in `files`
under `path`.

---

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