# avro.codec

> A module of avro's API.

Object Container File block codecs.

`DataFileReader` and `DataFileWriter` are parametrised on a `CodecSet`, a
compile-time table of block compressors. The default set — `DefaultCodecs` —
covers `null` and `deflate`. Avro's `deflate` is raw DEFLATE, which comes
from the sibling `deflate.mojo` tin: pure Mojo, no FFI, so the core library
still links nothing.

`snappy` and `zstandard` live in `avro.ext_snappy` / `avro.ext_zstd`, which
import the sibling magmalake tins. Nothing in `avro/__init__.mojo` imports
them, so a consumer only pays for a codec it actually asks for:

```mojo
from avro import DataFileReader
from avro.ext_zstd import AllCodecs          # needs -I ../snappy.mojo/src -I ../zstd.mojo/src

var r = DataFileReader[AllCodecs].open("f.avro")
```

## Structs

### `DefaultCodecs`

```mojo
struct DefaultCodecs
```

`null` and `deflate` — nothing beyond the pure-Mojo `deflate.mojo`.

Implements: `CodecSet`, `Movable`

#### `supports`

```mojo
def supports(name: StringSpan) -> Bool
```

#### `compress`

```mojo
def compress(name: StringSpan, data: Span[UInt8]) -> List[UInt8]
```

#### `decompress`

```mojo
def decompress(name: StringSpan, data: Span[UInt8]) -> List[UInt8]
```

## Traits

### `CodecSet`

```mojo
undefined
```

A compile-time table of Avro block codecs.

#### `supports`

```mojo
def supports(name: StringSpan) -> Bool
```

Whether this set can handle the `avro.codec` value `name`.

#### `compress`

```mojo
def compress(name: StringSpan, data: Span[UInt8]) -> List[UInt8]
```

#### `decompress`

```mojo
def decompress(name: StringSpan, data: Span[UInt8]) -> List[UInt8]
```

## Functions

### `unknown_codec`

```mojo
def unknown_codec(name: StringSpan) -> Error
```
