cbor/release_notes.md

74 lines
3.5 KiB
Markdown

# Release Notes — v1.1.0
2026-03-12
## Features
- **Custom encoder hooks**: Types can implement `cborEncode(writer: *Io.Writer) !void`
to control their own serialisation.
- **Custom extractor hooks**: Types can implement `cborExtract(iter: *[]const u8) !bool`
to control their own deserialisation. Enum types are
now also supported via `cborExtract`.
- **`extractAlloc`**: New allocating extractor for types containing slices
or heap-allocated payloads. Use `extractAlloc(&dest, allocator)` inside a
`match` pattern.
- **`extractAlloc` arrays**: `extractAlloc` now handles `[]T` slices,
allocating and populating each element.
- **Struct and union extraction**: `extract` and `extractAlloc` now handle
structs (decoded from CBOR maps) and tagged unions (decoded from
two-element CBOR arrays of `[tag, payload]`). Enum extraction is also
supported.
- **`fmtBuf`**: New `fmtBuf(buf, value) ![]const u8` — like `fmt` but
returns `error.NoSpaceLeft` instead of panicking on overflow.
- **`fmt` explicit panic**: `fmt` now calls `@panic("cbor.fmt: buffer too small")`
on overflow rather than `catch unreachable`.
- **Non-u8 slice matching**: `match` now supports patterns of the form
`&[_]T{...}` for slices and arrays where the element type is not `u8`.
- **`writeJsonValue` arrays and objects**: `writeJsonValue` now handles
`json.Value.array` and `json.Value.object`.
- **More explicit error handling**: Errors that were previously collapsed
are now surfaced with distinct error values.
## Bug Fixes
- **`matchArray` non-match**: `matchArray` was incorrectly returning an
error on a type mismatch instead of `false`.
- **`decodeMapHeader` error type**: Corrected the error return type to
include all possible errors.
- **Missing `NotAnObject` error**: Added missing error variant to the error
set.
- **`extract` optional null**: Extracting a null CBOR value into a
non-allocating optional now correctly sets the destination to `null`.
- **`extractAlloc` optional null**: Same fix for the allocating extractor
path.
- **`extractAlloc` `json.Value` arrays/objects**: Fell through to
union-match logic and failed. Now handled via `matchJsonValue` with the
real allocator.
- **`decodeNInt` overflow**: Decoding large negative integers (magnitude >
`maxInt(i64)`) would panic. Now returns `error.IntegerTooSmall`.
- **`skipValue` truncated floats**: Calling `skipValue` on a truncated
float16/32/64 would panic. Now returns `error.TooShort`.
- **`matchJsonValue` floats**: Float values were silently dropped during
CBOR→`json.Value` extraction. All three widths now decoded correctly.
- **`writeValue` large unsigned integers**: Unsigned integers wider than
`i64` were encoded incorrectly due to signed overflow.
- **`matchStructScalar` / `matchStructAlloc`**: A short read returned
`false` instead of propagating `error.TooShort`, masking corruption as a
non-match.
## Performance
- **`writeTypedVal`**: Single `writer.write` call instead of multiple
single-byte writes.
- **Float encoding**: `writeF16`/`writeF32`/`writeF64` each issue a single
write using `std.mem.writeInt` (also fixes a latent big-endian bug in the
previous manual byte-swap code).
- **`decodeUIntLength`**: Replaced recursive implementation with an
iterative one.
- **`fromJson` / `fromJsonAlloc`**: A single allocator is now threaded
through the entire JSON parse instead of creating a new arena per nested
container.
## Build
- Minimum Zig version is now **0.15.2**.
- Updated APIs for Zig 0.15 compatibility.