6个版本 (3个破坏性更新)
0.4.1 | 2022年2月25日 |
---|---|
0.4.0 | 2022年2月25日 |
0.3.1 | 2022年1月17日 |
0.2.0 | 2021年11月18日 |
0.1.0 | 2021年6月16日 |
#2008在编码中
每月下载43次
在5个crate(4个直接)中使用
36KB
1K SLoC
Buffalo
Buffalo是一种提供终极控制的二进制序列化格式。
示例
#[derive(buffalo::Read, buffalo::Write)]
#[buffalo(size = "dynamic")]
struct AddressBook {
#[buffalo(id = 0, required)]
pub contacts: Vec<Contact>,
}
#[derive(buffalo::Read, buffalo::Write)]
#[buffalo(size = "dynamic")]
struct Contact {
#[buffalo(id = 0, required)]
pub age: u16,
#[buffalo(id = 1, required)]
pub name: String,
#[buffalo(id = 2, required)]
pub phone_numbers: Option<Vec<PhoneNumber>>,
}
#[derive(buffalo::Read, buffalo::Write)]
#[buffalo(size = "static", value_size = 8)]
enum PhoneNumber {
#[allow(unused)]
#[buffalo(id = 0)]
Home(String),
#[allow(unused)]
#[buffalo(id = 1)]
Mobile(String),
}
fn address_book_example() {
let mut writer = buffalo::Writer::new();
let name = writer.write("John Doe");
let home = writer.write("1231231234");
let mobile = writer.write("4564564567");
let phone_numbers = writer.write(&vec![
PhoneNumberWriter::Home(home),
PhoneNumberWriter::Mobile(mobile),
]);
let contact = writer.write(&ContactWriter {
age: 28,
name,
phone_numbers: Some(phone_numbers),
});
let contacts = writer.write(&vec![contact]);
let address_book = writer.write(&AddressBookWriter { contacts });
writer.write(&address_book);
let bytes = writer.into_bytes();
let address_book = buffalo::read::<AddressBookReader>(&bytes);
let contact = address_book.contacts().get(0).unwrap();
assert_eq!(contact.name(), "John Doe");
assert_eq!(contact.age(), 28);
let phone_numbers = contact.phone_numbers();
let home = phone_numbers.unwrap().get(0).unwrap();
assert_eq!(home.as_home().unwrap(), "1231231234");
let mobile = phone_numbers.unwrap().get(1).unwrap();
assert_eq!(mobile.as_mobile().unwrap(), "4564564567");
}
依赖项
~2–3MB
~62K SLoC