use afastdata::{AFastDeserialize, AFastSerialize};
#[derive(AFastSerialize, AFastDeserialize, Debug, PartialEq)]
struct Player {
name: String,
level: u32,
hp: i32,
skills: Vec<String>,
guild: Option<String>,
}
#[derive(AFastSerialize, AFastDeserialize, Debug, PartialEq)]
enum Item {
Weapon { name: String, damage: i32 },
Potion { heal: i32 },
Gold(u64),
}
#[derive(AFastSerialize, AFastDeserialize, Debug, PartialEq)]
struct Inventory {
owner: String,
items: Vec<Item>,
capacity: u32,
}
fn roundtrip<T: AFastSerialize + AFastDeserialize + PartialEq + std::fmt::Debug>(val: &T) {
let bytes = val.to_bytes();
let (decoded, size) = T::from_bytes(&bytes).unwrap();
assert_eq!(size, bytes.len());
assert_eq!(*val, decoded);
println!("{:?} round-trip OK ({} bytes)", val, size);
}
fn main() {
let player = Player {
name: String::from("Alice"),
level: 42,
hp: 850,
skills: vec![String::from("fireball"), String::from("shield")],
guild: Some(String::from("Dragon Slayers")),
};
let bytes = player.to_bytes();
println!("Player 序列化后 {} 字节: {:?}", bytes.len(), bytes);
let (decoded, size) = Player::from_bytes(&bytes).unwrap();
println!("Player 反序列化后: {:?}", decoded);
println!("消耗字节数: {}", size);
assert_eq!(player, decoded);
println!("Player round-trip OK\n");
let items = vec![
Item::Weapon {
name: String::from("Excalibur"),
damage: 999,
},
Item::Potion { heal: 50 },
Item::Gold(10000),
];
let bytes = items.to_bytes();
println!("Items 序列化后 {} 字节: {:?}", bytes.len(), bytes);
let (decoded, _) = Vec::<Item>::from_bytes(&bytes).unwrap();
println!("Items 反序列化后: {:?}", decoded);
assert_eq!(items, decoded);
println!("Items round-trip OK\n");
let inventory = Inventory {
owner: String::from("Bob"),
items: vec![
Item::Weapon {
name: String::from("Dagger"),
damage: 25,
},
Item::Gold(500),
],
capacity: 20,
};
let bytes = inventory.to_bytes();
println!("Inventory 序列化后 {} 字节: {:?}", bytes.len(), bytes);
let (decoded, _) = Inventory::from_bytes(&bytes).unwrap();
println!("Inventory 反序列化后: {:?}", decoded);
assert_eq!(inventory, decoded);
println!("Inventory round-trip OK\n");
let lonely = Player {
name: String::from("Charlie"),
level: 1,
hp: 100,
skills: vec![],
guild: None,
};
let bytes = lonely.to_bytes();
let (decoded, _) = Player::from_bytes(&bytes).unwrap();
assert_eq!(lonely, decoded);
println!("Option::None round-trip OK");
roundtrip(&player);
roundtrip(&inventory);
roundtrip(&Item::Gold(42));
roundtrip(&vec![1i32, 2, 3]);
roundtrip(&Some(String::from("hello")));
roundtrip(&42u32);
println!("\nAll examples passed!");
}