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个直接)中使用

MIT许可证

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