toml
cbor_tree = "0.11"
serde = { version = "1.0", features = ["derive"] }
rust
use cbor_tree::{Cborize, DeserializeTrait, TokenBuilder};
#[derive(Debug)]
struct UserInfo {
username: String,
age: u8,
}
impl Cborize for UserInfo {
fn to_cbor(&self) -> Vec<u8> {
let mut builder = TokenBuilder::new();
builder
.add_text_string(self.username.clone())
.unwrap()
.add_unsigned_integer(self.age as u64)
.unwrap();
builder.build().unwrap().to_cbor()
}
}
impl DeserializeTrait for UserInfo {
fn from_cbor_value(value: cbor_tree::SimpleValue) -> Result<UserInfo, ()> {
match value {
cbor_tree::SimpleValue::List(list) => {
if list.len() == 2 {
let username = match &list[0] {
cbor_tree::SimpleValue::TextString(name) => name.clone(),
_ => return Err(()),
};
let age = match &list[1] {
cbor_tree::SimpleValue::UnsignedInteger(age) => *age as u8,
_ => return Err(()),
};
Ok(UserInfo { username, age })
} else {
Err(())
}
},
_ => Err(())
}
}
}
rust
fn main() {
let user = UserInfo {
username: String::from("Alice"),
age: 25,
};
let serialized = user.to_cbor();
println!("Serialized CBOR: {:?}", serialized);
let deserialized = match cbor_tree::from_slice(&serialized) {
Ok(value) => UserInfo::from_cbor_value(value),
Err(_) => Err(()),
};
match deserialized {
Ok(user) => println!("Deserialized User: {:?}", user),
Err(_) => println!("Deserialization failed!"),
}
}