# Buffalo Buffalo is a binary serialization format that gives you ultimate control. ## Example ```rust #[derive(buffalo::Read, buffalo::Write)] #[buffalo(size = "dynamic")] struct AddressBook { #[buffalo(id = 0, required)] pub contacts: Vec, } #[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>, } #[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::(&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"); } ```