# `locus_mmdb_tree`
[🔗](https://github.com/g-andrade/locus/blob/2.3.15/src/locus_mmdb_tree.erl#L24)

API for working with MMDB - tree section.

See [MaxMind DB File Format Specification](https://maxmind.github.io/MaxMind-DB/).

# `bad_tree_error`

```erlang
-type bad_tree_error() ::
          {invalid_node_index_for_ipv4_root, map()} | {ipv4_root_data_index_out_of_range, map()}.
```

# `index`

```erlang
-type index() :: non_neg_integer().
```

# `ip4_address_prefix`

```erlang
-type ip4_address_prefix() :: {inet:ip4_address(), 0..32}.
```

# `ip6_address_prefix`

```erlang
-type ip6_address_prefix() :: {inet:ip6_address(), 0..128}.
```

# `ip_address_prefix`

```erlang
-type ip_address_prefix() :: ip4_address_prefix() | ip6_address_prefix().
```

# `t`

```erlang
-opaque t()
```

# `lookup`

```erlang
-spec lookup(Address, Tree) -> {ok, DataIndex} | not_found | {error, Reason}
                when
                    Address :: inet:ip_address(),
                    Tree :: t(),
                    DataIndex :: locus_mmdb_data_codec:index(),
                    Reason :: ipv4_database | not_found.
```

Looks up for a `DataIndex` for `Address` within `Tree`.

# `new`

```erlang
-spec new(TreeData, NodeCount, RecordSize, IpVersion, DataSectionSize) -> {ok, Tree} | {error, Reason}
             when
                 TreeData :: binary(),
                 NodeCount :: non_neg_integer(),
                 RecordSize :: non_neg_integer(),
                 IpVersion :: 4 | 6,
                 DataSectionSize :: non_neg_integer(),
                 Tree :: t(),
                 Reason :: term().
```

Instantiates a new `Tree` out of `TreeData`, a few metadata properties
and `DataSectionSize`.

# `validate`

```erlang
-spec validate(fun((locus_mmdb_data_codec:index()) -> ok | {error, term()}),
               locus_mmdb_tree_walk_manager:handle(),
               locus_mmdb_check_journal:t(),
               t()) ->
                  ok.
```

---

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