#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(not(feature = "std"))]
extern crate alloc;
#[cfg(not(feature = "std"))]
use alloc::vec::Vec;
pub mod config;
pub mod decode;
pub mod encode;
pub mod error;
pub mod reader;
pub mod varint;
pub mod writer;
pub use config::Config;
pub use decode::Decode;
pub use encode::Encode;
pub use error::{JustcodeError, Result};
#[cfg(feature = "derive")]
pub use justcode_derive::{Decode, Encode};
pub fn encode_to_vec<T: Encode>(value: &T, config: Config) -> Result<Vec<u8>> {
let mut writer = writer::Writer::new(config);
value.encode(&mut writer)?;
Ok(writer.into_bytes())
}
pub fn decode_from_slice<T: Decode>(bytes: &[u8], config: Config) -> Result<(T, usize)> {
let mut reader = reader::Reader::new(bytes, config);
let value = T::decode(&mut reader)?;
let len = reader.bytes_read();
Ok((value, len))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_encode_decode_u32() {
let config = config::standard();
let value = 42u32;
let encoded = encode_to_vec(&value, config).unwrap();
let (decoded, len): (u32, usize) = decode_from_slice(&encoded, config).unwrap();
assert_eq!(value, decoded);
assert_eq!(len, encoded.len());
}
#[test]
fn test_encode_decode_vec() {
let config = config::standard();
let value = vec![1u32, 2, 3, 4];
let encoded = encode_to_vec(&value, config).unwrap();
let (decoded, len): (Vec<u32>, usize) = decode_from_slice(&encoded, config).unwrap();
assert_eq!(value, decoded);
assert_eq!(len, encoded.len());
}
}