serde_jam/
lib.rs

1#![doc = include_str!("../README.md")]
2#![warn(missing_docs)]
3#![cfg_attr(not(feature = "std"), no_std)]
4
5#[cfg(not(feature = "std"))]
6extern crate alloc;
7
8pub(crate) use internal::*;
9pub use {
10    compact::Numeric,
11    de::Deserializer,
12    error::{Error, Result},
13    io::{Reader, Writer},
14    ser::Serializer,
15    with::bytes,
16};
17
18pub mod compact;
19mod de;
20mod error;
21mod internal;
22pub mod io;
23mod ser;
24pub mod visitor;
25mod with;
26
27/// Trait for types that can be encoded and decoded using serde-jam
28pub trait Codec: serde::Serialize + serde::de::DeserializeOwned {
29    /// Encode the value into a byte vector
30    fn encode(&self) -> anyhow::Result<Vec<u8>> {
31        encode(&self).map_err(Into::into)
32    }
33
34    /// Decode the value from a byte vector
35    fn decode(value: &[u8]) -> anyhow::Result<Self> {
36        decode(value).map_err(Into::into)
37    }
38}
39
40impl<T: serde::Serialize + serde::de::DeserializeOwned> Codec for T {}
41
42/// Encode a value to a byte vector
43pub fn encode<T: serde::Serialize>(value: &T) -> Result<Vec<u8>> {
44    let mut serializer = Serializer::default();
45    value.serialize(&mut serializer)?;
46    Ok(serializer.output)
47}
48
49/// Decode a value from a byte vector
50pub fn decode<'de, T: serde::Deserialize<'de>>(value: &'de [u8]) -> Result<T> {
51    let mut deserializer: Deserializer<'de> = Deserializer::new(value);
52    T::deserialize(&mut deserializer)
53}