mod encode;
mod error;
mod util;
use std::io::Write;
pub use encode::Serializer;
pub use error::{Error, Result};
use serde::ser::Serialize;
pub fn to_string<T: Serialize>(obj: &T) -> Result<String> {
Ok(unsafe { String::from_utf8_unchecked(to_bytes(obj)?) })
}
pub fn to_bytes<T: Serialize>(obj: &T) -> Result<Vec<u8>> {
let mut serializer = Serializer::new(Vec::with_capacity(256));
obj.serialize(&mut serializer)?;
Ok(serializer.writer())
}
pub fn to_writer<T: Serialize, W: Write>(dst: &mut W, src: &T) -> Result<()> {
let mut serializer = Serializer::new(dst);
src.serialize(&mut serializer)?;
Ok(())
}
#[cfg(test)]
mod tests {
use crate::to_writer;
use super::to_string;
use serde::Serialize;
use std::collections::HashMap;
#[derive(Serialize)]
struct MyStruct<'a> {
message: String,
integer: i64,
enum_val: MyEnum,
#[serde(with = "serde_bytes")]
b: &'a [u8],
nums: [i32; 4],
my_map: HashMap<usize, bool>,
}
#[allow(dead_code)]
#[derive(Serialize)]
enum MyEnum {
Variant1,
Variant2,
Variant3(u128),
}
#[test]
fn serialize_struct() {
let mut m = HashMap::new();
m.insert(33, true);
m.insert(34, false);
let mut my_struct = MyStruct {
message: String::from("hello world"),
integer: 3829,
enum_val: MyEnum::Variant2,
b: &[0xFF, 0x01, 0x43, 0x64],
nums: [1, 2, 3, 4],
my_map: m,
};
assert_eq!(
to_string(&my_struct).unwrap(),
"message=\"hello world\" integer=3829 enum_val=MyEnum::Variant2 b=FF014364 nums.0=1 nums.1=2 nums.2=3 nums.3=4 my_map.33"
);
my_struct.message = "\x7FHello World".to_owned();
assert_eq!(
to_string(&my_struct).unwrap(),
"message=\"␡Hello World\" integer=3829 enum_val=MyEnum::Variant2 b=FF014364 nums.0=1 nums.1=2 nums.2=3 nums.3=4 my_map.33"
);
my_struct.message = "\n \\n".to_owned();
my_struct.enum_val = MyEnum::Variant3(389384893);
assert_eq!(
to_string(&my_struct).unwrap(),
"message=\"\\n \\n\" integer=3829 enum_val=389384893 b=FF014364 nums.0=1 nums.1=2 nums.2=3 nums.3=4 my_map.33"
)
}
#[test]
fn test_to_writer() {
let mut v = Vec::new();
let mut m = HashMap::new();
m.insert(33, true);
m.insert(34, false);
let my_struct = MyStruct {
message: String::from("hello world"),
integer: 3829,
enum_val: MyEnum::Variant2,
b: &[0xFF, 0x01, 0x43, 0x64],
nums: [1, 2, 3, 4],
my_map: m,
};
to_writer(&mut v, &my_struct).unwrap();
assert_eq!(
unsafe { String::from_utf8_unchecked(v) },
"message=\"hello world\" integer=3829 enum_val=MyEnum::Variant2 b=FF014364 nums.0=1 nums.1=2 nums.2=3 nums.3=4 my_map.33"
);
}
}