Wado

core:cbor

CBOR serialization and deserialization (RFC 8949, STD 94).

Implements the core:serde Serializer and Deserializer traits for the Concise Binary Object Representation. The data model is a strict superset of JSON's, so any type that serializes to core:json serializes to CBOR with no source changes — the derived Serialize/Deserialize impls drive both.

The API is bytes-only (CBOR is binary).

Encoding uses preferred (shortest) serialization (RFC 8949 §4.1). Decoding is variation-tolerant (§4.1): it accepts any well-formed encoding, preferred or not, definite or indefinite length. to_bytes_canonical emits the Core Deterministic Encoding profile (§4.2.1) for COSE-style signing, with the documented float caveat (this encoder never emits binary16, so the canonical float ladder stops at binary32).

The spec is vendored verbatim at wado-compiler/ref/rfc8949.txt; comments cite section numbers from it.

Synopsis

struct Point {
    x: i32,
    y: i32,
}
impl Serialize for Point;
impl Deserialize for Point;

let encoded = to_bytes(&Point { x: 1, y: 2 });
assert encoded matches { Ok(b) && from_bytes::<Point>(b) matches { Ok(p) && p.x == 1 && p.y == 2 } };

Functions

pub fn to_bytes<T: Serialize>(value: &T) -> Result<ByteList, SerializeError>

Serialize a value to CBOR using preferred (shortest) serialization.

Not guaranteed to be deterministic across equal values whose maps were built in different orders; use to_bytes_canonical when byte-exact reproducibility matters (e.g. COSE/CWT signing).

pub fn to_bytes_canonical<T: Serialize>(value: &T) -> Result<ByteList, SerializeError>

Serialize a value to CBOR using the Core Deterministic Encoding profile (RFC 8949 §4.2.1): preferred integer/length/tag forms, definite-length containers, and map keys sorted by the bytewise order of their encoded form. Equal values produce byte-identical output regardless of map insertion order — use this for COSE/CWT signing or content addressing.

Float caveat: the ladder stops at binary32, so output may differ from a reference deterministic encoder on float-bearing values.

pub fn from_bytes<T: Deserialize, B: AsByteSlice>(input: B, strict: bool = true, max_depth: i32 = DEFAULT_MAX_DEPTH) -> Result<T, DeserializeError>

Deserialize a value from CBOR — the primary entry point. Accepts any AsByteSlice source with no copy. strict rejects items the target cannot represent; max_depth bounds nesting, raised only for a trusted source.

Structs

pub struct CborSeqSerializer

Fields are private.

impl SerializeSeq for CborSeqSerializer

fn element<T: Serialize>(&mut self, value: &T) -> Result<(), SerializeError>
fn end(&mut self) -> Result<(), SerializeError>

pub struct CborMapSerializer

Fields are private.

impl SerializeMap for CborMapSerializer

fn key<T: Serialize>(&mut self, key: &T) -> Result<(), SerializeError>
fn value<T: Serialize>(&mut self, value: &T) -> Result<(), SerializeError>
fn end(&mut self) -> Result<(), SerializeError>

pub struct CborStructSerializer

Fields are private.

impl SerializeStruct for CborStructSerializer

fn field<T: Serialize, S: AsStrSlice>(&mut self, name: S, value: &T) -> Result<(), SerializeError>
fn end(&mut self) -> Result<(), SerializeError>

pub struct CborVariantSerializer

Fields are private.

impl SerializeVariant for CborVariantSerializer

fn payload<T: Serialize>(&mut self, value: &T) -> Result<(), SerializeError>
fn end(&mut self) -> Result<(), SerializeError>

pub struct CborSerializer

Fields are private.

impl Serializer for CborSerializer

fn serialize_i32(&mut self, v: i32) -> Result<(), SerializeError>
fn serialize_i64(&mut self, v: i64) -> Result<(), SerializeError>
fn serialize_u32(&mut self, v: u32) -> Result<(), SerializeError>
fn serialize_u64(&mut self, v: u64) -> Result<(), SerializeError>
fn serialize_i128(&mut self, v: i128) -> Result<(), SerializeError>
fn serialize_u128(&mut self, v: u128) -> Result<(), SerializeError>
fn serialize_f32(&mut self, v: f32) -> Result<(), SerializeError>
fn serialize_f64(&mut self, v: f64) -> Result<(), SerializeError>
fn serialize_bool(&mut self, v: bool) -> Result<(), SerializeError>
fn serialize_char(&mut self, v: char) -> Result<(), SerializeError>
fn serialize_string<S: AsStrSlice>(&mut self, v: S) -> Result<(), SerializeError>
fn is_human_readable(&self) -> bool
fn serialize_tag(&mut self, tag: u64) -> Result<(), SerializeError>
fn serialize_bytes(&mut self, v: ByteSlice) -> Result<(), SerializeError>
fn serialize_null(&mut self) -> Result<(), SerializeError>
fn begin_seq(&mut self, len: i32) -> Result<CborSeqSerializer, SerializeError>
fn begin_map(&mut self, len: i32) -> Result<CborMapSerializer, SerializeError>
fn begin_struct<S: AsStrSlice>(&mut self, name: S, fields: i32) -> Result<CborStructSerializer, SerializeError>
fn serialize_unit_variant<S: AsStrSlice, S1: AsStrSlice>(&mut self, type_name: S, variant_name: S1, disc: i32) -> Result<(), SerializeError>
fn begin_variant<S: AsStrSlice, S1: AsStrSlice>(&mut self, type_name: S, variant_name: S1, disc: i32) -> Result<CborVariantSerializer, SerializeError>

pub struct CanonicalCborSeqSerializer

Fields are private.

impl SerializeSeq for CanonicalCborSeqSerializer

fn element<T: Serialize>(&mut self, value: &T) -> Result<(), SerializeError>
fn end(&mut self) -> Result<(), SerializeError>

pub struct CanonicalCborMapSerializer

Fields are private.

impl SerializeMap for CanonicalCborMapSerializer

fn key<T: Serialize>(&mut self, key: &T) -> Result<(), SerializeError>
fn value<T: Serialize>(&mut self, value: &T) -> Result<(), SerializeError>
fn end(&mut self) -> Result<(), SerializeError>

pub struct CanonicalCborStructSerializer

Fields are private.

impl SerializeStruct for CanonicalCborStructSerializer

fn field<T: Serialize, S: AsStrSlice>(&mut self, name: S, value: &T) -> Result<(), SerializeError>
fn end(&mut self) -> Result<(), SerializeError>

pub struct CanonicalCborVariantSerializer

Fields are private.

impl SerializeVariant for CanonicalCborVariantSerializer

fn payload<T: Serialize>(&mut self, value: &T) -> Result<(), SerializeError>
fn end(&mut self) -> Result<(), SerializeError>

pub struct CanonicalCborSerializer

Fields are private.

impl Serializer for CanonicalCborSerializer

fn serialize_i32(&mut self, v: i32) -> Result<(), SerializeError>
fn serialize_i64(&mut self, v: i64) -> Result<(), SerializeError>
fn serialize_u32(&mut self, v: u32) -> Result<(), SerializeError>
fn serialize_u64(&mut self, v: u64) -> Result<(), SerializeError>
fn serialize_i128(&mut self, v: i128) -> Result<(), SerializeError>
fn serialize_u128(&mut self, v: u128) -> Result<(), SerializeError>
fn serialize_f32(&mut self, v: f32) -> Result<(), SerializeError>
fn serialize_f64(&mut self, v: f64) -> Result<(), SerializeError>
fn serialize_bool(&mut self, v: bool) -> Result<(), SerializeError>
fn serialize_char(&mut self, v: char) -> Result<(), SerializeError>
fn serialize_string<S: AsStrSlice>(&mut self, v: S) -> Result<(), SerializeError>
fn is_human_readable(&self) -> bool
fn serialize_tag(&mut self, tag: u64) -> Result<(), SerializeError>
fn serialize_bytes(&mut self, v: ByteSlice) -> Result<(), SerializeError>
fn serialize_null(&mut self) -> Result<(), SerializeError>
fn begin_seq(&mut self, len: i32) -> Result<CanonicalCborSeqSerializer, SerializeError>
fn begin_map(&mut self, len: i32) -> Result<CanonicalCborMapSerializer, SerializeError>
fn begin_struct<S: AsStrSlice>(&mut self, name: S, fields: i32) -> Result<CanonicalCborStructSerializer, SerializeError>
fn serialize_unit_variant<S: AsStrSlice, S1: AsStrSlice>(&mut self, type_name: S, variant_name: S1, disc: i32) -> Result<(), SerializeError>
fn begin_variant<S: AsStrSlice, S1: AsStrSlice>(&mut self, type_name: S, variant_name: S1, disc: i32) -> Result<CanonicalCborVariantSerializer, SerializeError>

pub struct CborDeserializer

Fields are private.

impl Deserializer for CborDeserializer

fn deserialize_i32(&mut self) -> Result<i32, DeserializeError>
fn deserialize_i64(&mut self) -> Result<i64, DeserializeError>
fn deserialize_u32(&mut self) -> Result<u32, DeserializeError>
fn deserialize_u64(&mut self) -> Result<u64, DeserializeError>
fn deserialize_i128(&mut self) -> Result<i128, DeserializeError>
fn deserialize_u128(&mut self) -> Result<u128, DeserializeError>
fn deserialize_f32(&mut self) -> Result<f32, DeserializeError>
fn deserialize_f64(&mut self) -> Result<f64, DeserializeError>
fn deserialize_f16(&mut self) -> Result<f16, DeserializeError>
fn deserialize_bf16(&mut self) -> Result<bf16, DeserializeError>
fn deserialize_bool(&mut self) -> Result<bool, DeserializeError>
fn deserialize_char(&mut self) -> Result<char, DeserializeError>
fn deserialize_string(&mut self) -> Result<String, DeserializeError>
fn deserialize_bytes(&mut self) -> Result<ByteList, DeserializeError>
fn is_null(&mut self) -> Result<bool, DeserializeError>
fn begin_container<S: AsStrSlice>(&mut self, want_major: u8, expected: S) -> Result<[i64, bool, i32], DeserializeError>

Open a container of the expected major type, unwrapping any self-described prefix. remaining is -1 when indefinite; expected is the type-mismatch diagnostic, by reference so success allocates none.

fn begin_seq(&mut self) -> Result<CborSeqAccess, DeserializeError>
fn begin_map(&mut self) -> Result<CborMapAccess, DeserializeError>
fn begin_struct<S: AsStrSlice>(&mut self, name: S, num_fields: i32) -> Result<CborStructAccess, DeserializeError>
fn begin_variant<S: AsStrSlice>(&mut self, type_name: S, num_cases: i32) -> Result<CborVariantAccess, DeserializeError>
fn deserialize_any<V: Visitor>(&mut self, visitor: &mut V) -> Result<V::Value, DeserializeError>

pub struct CborSeqAccess

Fields are private.

impl DeserializeSeq for CborSeqAccess

fn next_element<T: Deserialize>(&mut self) -> Result<Option<T>, DeserializeError>
fn end(&mut self) -> Result<(), DeserializeError>

pub struct CborMapAccess

Fields are private.

impl DeserializeMap for CborMapAccess

fn next_key<K: Deserialize>(&mut self) -> Result<Option<K>, DeserializeError>
fn next_value<V: Deserialize>(&mut self) -> Result<V, DeserializeError>
fn end(&mut self) -> Result<(), DeserializeError>

pub struct CborStructAccess

Fields are private.

impl DeserializeStruct for CborStructAccess

fn next_field<S: FieldSchema>(&mut self) -> Result<Option<i32>, DeserializeError>
fn value<T: Deserialize>(&mut self) -> Result<T, DeserializeError>
fn skip(&mut self) -> Result<(), DeserializeError>
fn end(&mut self) -> Result<(), DeserializeError>

pub struct CborVariantAccess

Fields are private.

impl DeserializeVariant for CborVariantAccess

fn variant_name(&mut self) -> Result<String, DeserializeError>
fn disc(&mut self) -> Result<i32, DeserializeError>
fn payload<T: Deserialize>(&mut self) -> Result<T, DeserializeError>
fn is_unit(&mut self) -> Result<bool, DeserializeError>
fn end(&mut self) -> Result<(), DeserializeError>