#![deny(unsafe_code)]
#![warn(missing_docs, rust_2018_idioms)]
#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(not(feature = "std"))]
extern crate alloc;
#[cfg(not(feature = "std"))]
use alloc::{vec, vec::Vec, string::String};
pub mod error;
pub mod ser;
pub mod de;
pub mod buffer;
pub mod compression;
#[cfg(feature = "async")]
pub mod async_ser;
#[cfg(feature = "async")]
pub mod async_de;
pub use error::{Error, Result};
pub use ser::{Serializer, to_bytes, to_writer};
pub use de::{Deserializer, from_bytes, from_reader};
pub use buffer::{WriteBuffer, ReadBuffer};
#[cfg(feature = "async")]
pub use async_ser::{AsyncSerializer, to_bytes_async, to_writer_async};
#[cfg(feature = "async")]
pub use async_de::{AsyncDeserializer, from_bytes_async, from_reader_async};
pub use compression::{
CompressionFormat, CompressionLevel,
compress, decompress, compress_default, is_serialized
};
pub const MAGIC: &[u8] = b"NANO";
pub const VERSION: u8 = 1;
pub const DEFAULT_BUFFER_SIZE: usize = 8192;
pub fn serialize<T>(value: &T) -> Result<Vec<u8>>
where
T: serde::Serialize,
{
to_bytes(value)
}
pub fn deserialize<'de, T>(bytes: &'de [u8]) -> Result<T>
where
T: serde::Deserialize<'de>,
{
from_bytes(bytes)
}
#[cfg(any(feature = "compression", feature = "multi-compression"))]
pub fn serialize_compressed<T>(value: &T, level: CompressionLevel) -> Result<Vec<u8>>
where
T: serde::Serialize,
{
let serialized = to_bytes(value)?;
compress(&serialized, CompressionFormat::default(), level)
}
#[cfg(any(feature = "compression", feature = "multi-compression"))]
pub fn deserialize_compressed<T>(bytes: &[u8]) -> Result<T>
where
T: for<'de> serde::Deserialize<'de>,
{
let decompressed = decompress(bytes)?;
let borrowed_bytes = &decompressed;
from_bytes(borrowed_bytes)
}
#[cfg(test)]
mod tests {
use super::*;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct TestStruct {
name: String,
value: u64,
items: Vec<i32>,
flag: bool,
}
#[test]
fn test_basic_serialization() {
let data = TestStruct {
name: "test".to_string(),
value: 42,
items: vec![1, 2, 3, 4, 5],
flag: true,
};
let serialized = serialize(&data).unwrap();
let deserialized: TestStruct = deserialize(&serialized).unwrap();
assert_eq!(data, deserialized);
}
#[test]
fn test_empty_collections() {
let data = TestStruct {
name: String::new(),
value: 0,
items: vec![],
flag: false,
};
let serialized = serialize(&data).unwrap();
let deserialized: TestStruct = deserialize(&serialized).unwrap();
assert_eq!(data, deserialized);
}
#[test]
fn test_primitive_types() {
assert_eq!(42u32, deserialize::<u32>(&serialize(&42u32).unwrap()).unwrap());
assert_eq!(-100i64, deserialize::<i64>(&serialize(&-100i64).unwrap()).unwrap());
assert_eq!(3.14f64, deserialize::<f64>(&serialize(&3.14f64).unwrap()).unwrap());
assert_eq!(true, deserialize::<bool>(&serialize(&true).unwrap()).unwrap());
assert_eq!("hello", deserialize::<&str>(&serialize(&"hello").unwrap()).unwrap());
}
#[cfg(any(feature = "compression", feature = "multi-compression"))]
#[test]
fn test_compression() {
let data = TestStruct {
name: "x".repeat(1000), value: 12345,
items: vec![42; 100],
flag: true,
};
let compressed = serialize_compressed(&data, CompressionLevel::Default).unwrap();
let decompressed: TestStruct = deserialize_compressed(&compressed).unwrap();
assert_eq!(data, decompressed);
let uncompressed = serialize(&data).unwrap();
assert!(compressed.len() < uncompressed.len());
}
}