# kiwi_codec v0.6.0 - Table of Contents

> Pure Elixir codec for Kiwi schema binary messages

## Pages

- [KiwiCodec](readme.md)
- [Native decoders](native-decoders.md)
- [Internals](internals.md)
- [Changelog](changelog.md)

## Modules

- Codec
  - [KiwiCodec](KiwiCodec.md): Encodes and decodes Kiwi messages as Elixir structs.
  - [KiwiCodec.Container](KiwiCodec.Container.md): Helpers for Kiwi chunk containers with an 8-byte magic and little-endian chunk lengths.

  - [KiwiCodec.DSL](KiwiCodec.DSL.md): Compile-time DSL behind `use KiwiCodec`.
  - [KiwiCodec.DecodeError](KiwiCodec.DecodeError.md): Raised when Kiwi wire data or binary schema data cannot be decoded.

  - [KiwiCodec.EncodeError](KiwiCodec.EncodeError.md): Raised when a value cannot be encoded as Kiwi wire data.

  - [KiwiCodec.TransformModule](KiwiCodec.TransformModule.md): Hook behaviour for custom Kiwi encode/decode normalization.

- Schemas
  - [KiwiCodec.Metadata](KiwiCodec.Metadata.md): Compiled metadata attached to generated Kiwi modules.
  - [KiwiCodec.Metadata.Field](KiwiCodec.Metadata.Field.md): Compiled metadata for one field in a generated Kiwi module.

  - [KiwiCodec.PrimitiveType](KiwiCodec.PrimitiveType.md): Kiwi primitive type metadata.
  - [KiwiCodec.Schema](KiwiCodec.Schema.md): Parsed Kiwi schema.

  - [KiwiCodec.Schema.Binary](KiwiCodec.Schema.Binary.md): Encoder and decoder for Kiwi's compact binary schema format.

  - [KiwiCodec.Schema.Enum](KiwiCodec.Schema.Enum.md): Kiwi enum definition.

  - [KiwiCodec.Schema.EnumVariant](KiwiCodec.Schema.EnumVariant.md): Kiwi enum variant.

  - [KiwiCodec.Schema.Field](KiwiCodec.Schema.Field.md): Kiwi struct or message field.

  - [KiwiCodec.Schema.Message](KiwiCodec.Schema.Message.md): Kiwi message definition.

  - [KiwiCodec.Schema.Struct](KiwiCodec.Schema.Struct.md): Kiwi struct definition.

  - [KiwiCodec.SchemaInterpreter](KiwiCodec.SchemaInterpreter.md): Interpreter for parsed Kiwi schemas without generated modules.
  - [KiwiCodec.SchemaInterpreter.Prepared](KiwiCodec.SchemaInterpreter.Prepared.md): Indexed Kiwi schema for repeated runtime interpretation.

- Wire encoding
  - [KiwiCodec.Wire](KiwiCodec.Wire.md): Kiwi primitive wire encoders and decoders.
  - [KiwiCodec.Wire.VarFloat](KiwiCodec.Wire.VarFloat.md): Kiwi variable-length 32-bit float wire encoding.
  - [KiwiCodec.Wire.Varint](KiwiCodec.Wire.Varint.md): Kiwi integer wire encoding.

- Elixir generation
  - [KiwiCodec.FileGenerator](KiwiCodec.FileGenerator.md): Writes generated Elixir source files from `.kiwi` schema text or parsed schemas.

  - [KiwiCodec.ModuleCompiler](KiwiCodec.ModuleCompiler.md): Compiles `.kiwi` schema text or parsed schemas into Elixir modules in memory.
  - [KiwiCodec.ModuleGenerator](KiwiCodec.ModuleGenerator.md): Generates Elixir source modules from parsed Kiwi schemas.

- Rustler generation
  - [KiwiCodec.RustlerGenerator](KiwiCodec.RustlerGenerator.md): Generates Rust that decodes Kiwi data for a schema inside a Rustler NIF.
  - [KiwiCodec.RustlerGenerator.Decoder](KiwiCodec.RustlerGenerator.Decoder.md): The `Decoder<'a>` generated decoders read Kiwi data with.
  - [KiwiCodec.RustlerGenerator.Records](KiwiCodec.RustlerGenerator.Records.md): Generates native Kiwi records: decoded values Rust code can read, change, and share without
building Elixir terms, and encode later as the sparse maps generated decoders return.
  - [KiwiCodec.RustlerGenerator.UnknownFields](KiwiCodec.RustlerGenerator.UnknownFields.md): Selects how generated Rustler decoders handle message fields the compiled
schema does not define.

- Codec internals
  - [KiwiCodec.Decoder](KiwiCodec.Decoder.md): Decodes Kiwi wire binaries into generated Kiwi structs.
  - [KiwiCodec.Encoder](KiwiCodec.Encoder.md): Encodes generated Kiwi structs into Kiwi wire iodata.
  - [KiwiCodec.GeneratedModule.Metadata](KiwiCodec.GeneratedModule.Metadata.md): Builds compiled metadata for modules generated with `use KiwiCodec`.

  - [KiwiCodec.GeneratedModule.Shape](KiwiCodec.GeneratedModule.Shape.md): Emits enum, struct, and message shape code for modules generated with `use KiwiCodec`.

  - [KiwiCodec.GeneratedModule.TypeSpec](KiwiCodec.GeneratedModule.TypeSpec.md): Builds typespec AST for generated Kiwi modules.

  - [KiwiCodec.Inspect](KiwiCodec.Inspect.md): Shared `Inspect` implementation for generated Kiwi structs.

- Schema internals
  - [KiwiCodec.Schema.Binary.TypeIndex](KiwiCodec.Schema.Binary.TypeIndex.md): Encodes and decodes type references in Kiwi's compact binary schema format.
  - [KiwiCodec.Schema.Parser](KiwiCodec.Schema.Parser.md): Parser for `.kiwi` schema text.

  - [KiwiCodec.Schema.Token](KiwiCodec.Schema.Token.md): Source token with line and column information for schema parse errors.

  - [KiwiCodec.Schema.Tokenizer](KiwiCodec.Schema.Tokenizer.md): Tokenizes `.kiwi` schema text with source positions.
  - [KiwiCodec.Schema.Validator](KiwiCodec.Schema.Validator.md): Validates parsed Kiwi schemas after grammar parsing.

- Rustler generation internals
  - [KiwiCodec.RustlerGenerator.AtomCache](KiwiCodec.RustlerGenerator.AtomCache.md): Interns the atoms generated sparse decoders put in every map: the module name, the
`__kiwi_module__` key, and each field name.
  - [KiwiCodec.RustlerGenerator.DecoderMacro](KiwiCodec.RustlerGenerator.DecoderMacro.md): Rusty-Elixir macro support for generated Rustler decoders.
  - [KiwiCodec.RustlerGenerator.Definition](KiwiCodec.RustlerGenerator.Definition.md): Generates Rust items for Kiwi schema definitions.

  - [KiwiCodec.RustlerGenerator.Entrypoint](KiwiCodec.RustlerGenerator.Entrypoint.md): Generates Rustler NIF entrypoint items for Kiwi decoders.

  - [KiwiCodec.RustlerGenerator.Full.Helpers](KiwiCodec.RustlerGenerator.Full.Helpers.md): RustQ-authored full Kiwi decoder macro helpers.

  - [KiwiCodec.RustlerGenerator.Name](KiwiCodec.RustlerGenerator.Name.md): Naming helpers for Rustler decoder code generated from Kiwi schemas.

  - [KiwiCodec.RustlerGenerator.RustExpr](KiwiCodec.RustlerGenerator.RustExpr.md): Rust expressions generated decoders read Kiwi values with, built as RustQ AST.
  - [KiwiCodec.RustlerGenerator.Selection](KiwiCodec.RustlerGenerator.Selection.md): Selects schema definitions and their dependencies for Rustler generation.

  - [KiwiCodec.RustlerGenerator.Skip](KiwiCodec.RustlerGenerator.Skip.md): Generates generic Kiwi schema skip decoders for Rustler native backends.
  - [KiwiCodec.RustlerGenerator.Skip.Descriptor](KiwiCodec.RustlerGenerator.Skip.Descriptor.md): Names the Rust function that skips one value of a Kiwi type: a primitive's
shared skip helper, `kiwi_skip_uint_value` for an enum, or the generated
`skip_<definition>_from_decoder` for a struct or message.

  - [KiwiCodec.RustlerGenerator.Skip.Helpers](KiwiCodec.RustlerGenerator.Skip.Helpers.md): Builds RustQ-authored shared skip helper functions for generated Rustler decoders.
  - [KiwiCodec.RustlerGenerator.Skip.Kind](KiwiCodec.RustlerGenerator.Skip.Kind.md): Semantic skip operation for one Kiwi field value.

  - [KiwiCodec.RustlerGenerator.Skip.ValueHelpers](KiwiCodec.RustlerGenerator.Skip.ValueHelpers.md): RustQ-authored primitive Kiwi skip helpers used by generated Rustler decoders.

  - [KiwiCodec.RustlerGenerator.Sparse](KiwiCodec.RustlerGenerator.Sparse.md): Generates generic sparse Kiwi schema decoders for Rustler native backends.
  - [KiwiCodec.RustlerGenerator.Sparse.Helpers](KiwiCodec.RustlerGenerator.Sparse.Helpers.md): Builds RustQ-authored shared sparse helper functions for generated Rustler decoders.
  - [KiwiCodec.RustlerGenerator.Splice](KiwiCodec.RustlerGenerator.Splice.md): Static RustQ splice fragments required by generated Rustler decoders.

## Mix Tasks

- [mix kiwi.gen](Mix.Tasks.Kiwi.Gen.md): Generates Elixir modules from a `.kiwi` schema.

