#[derive(Debug)] struct Item { sku: Vec, qty: i64, cents: i64 } #[derive(Debug)] struct Order { id: i64, customer: Vec, items: Vec } fn main() { fn parse_items(field: &[u8]) -> Vec { field.split(|&b| b == b';').map(|record| { let p: Vec<&[u8]> = record.split(|&b| b == b':').collect(); let qty = std::str::from_utf8(p[1]).unwrap().parse::().unwrap(); let cents = std::str::from_utf8(p[2]).unwrap().parse::().unwrap(); Item { sku: p[0].to_vec(), qty, cents } }).collect() } let mut book: Vec = Vec::new(); book.push(Order { id: 1001, customer: b"alice".to_vec(), items: parse_items(b"SKU-441:2:1999;SKU-7:1:500") }); for o in &book { let t: i64 = o.items.iter().map(|item| item.qty * item.cents).sum(); use std::io::Write; let mut out=std::io::stdout().lock(); out.write_all(&o.customer).unwrap(); writeln!(&mut out," owes {t} cents over {} items",o.items.len()).unwrap(); } assert_eq!(book[0].items[0].sku,b"SKU-441");assert_eq!(book[0].id,1001); }