pub fn canonize<T: Serialize>(value: &T) -> Result<Vec<u8>, CanonicalError>Expand description
Canoniza qualquer Serialize em bytes determinísticos JSON-compatíveis.
Converte um valor serializável em bytes canônicos seguindo as regras do Paper II:
- Objetos: chaves ordenadas lexicograficamente
- Strings: normalização Unicode NFC (quando
feature = "unicode") - Números: apenas inteiros em forma mínima (floats são rejeitados)
- Literais:
true/false/nullem minúsculas (padrão JSON) - Sem whitespace estrutural extra
O resultado garante que valores semanticamente equivalentes produzem exatamente os mesmos bytes, permitindo hashing determinístico e assinaturas verificáveis.
§Erros
CanonicalError::FloatNotAllowedse o valor contiver números de ponto flutuanteCanonicalError::Serdese a serialização falhar
§Exemplo
use json_atomic::canonize;
use serde::Serialize;
#[derive(Serialize)]
struct Note {
title: String,
done: bool,
}
let note = Note {
title: "Hello".into(),
done: false,
};
let canonical = canonize(¬e)?;
// Mesmo valor sempre produz os mesmos bytes
let canonical2 = canonize(¬e)?;
assert_eq!(canonical, canonical2);