packlist: add support for parsing of multiple premarkers per item
Dependencies
Change contents
- edit in crates/zhed-packlist/src/serial.rs at line 1
use crate::{ItemData, PackList, Section}; - edit in crates/zhed-packlist/src/serial.rs at line 3
use crate::{PackList, Section, ItemData}; - replacement in crates/zhed-packlist/src/serial.rs at line 45
macro_rules! commit { () => {{if sections.contains_key(§ion.0) {return Err(Error::SectionOverwritten(section.0));}sections.insert(std::mem::take(&mut section.0), std::mem::take(&mut section.1));}} }macro_rules! commit {() => {{if sections.contains_key(§ion.0) {return Err(Error::SectionOverwritten(section.0));}sections.insert(std::mem::take(&mut section.0),std::mem::take(&mut section.1),);}};} - edit in crates/zhed-packlist/src/serial.rs at line 82
let mkerr = || Error::InvalidItem(line.to_string()); - replacement in crates/zhed-packlist/src/serial.rs at line 84
return Err(Error::InvalidItem(line.to_string()));return Err(mkerr());}let mut it = line.chars().peekable();// parse premarkerslet mut premarkers = Vec::new();while it.next_if(|i| *i == '[').is_some() {let premarker = it.next().ok_or_else(mkerr)?;let _ = it.next().ok_or_else(mkerr)?;let c2 = it.next().ok_or_else(mkerr)?;if c2 != ']' {return Err(mkerr());}premarkers.push(premarker);while it.next_if(|i| i.is_whitespace()).is_some() {} - replacement in crates/zhed-packlist/src/serial.rs at line 100
let mut it = line.chars();let c1 = it.next().unwrap();let premarker = it.next().unwrap();let _ = it.next().unwrap();let c2 = it.next().unwrap();if c1 != '[' || c2 != ']' {return Err(Error::InvalidItem(line.to_string()));if premarkers.is_empty() {return Err(mkerr()); - edit in crates/zhed-packlist/src/serial.rs at line 103
let mut it = it.peekable();while it.next_if(|i| i.is_whitespace()).is_some() {} - edit in crates/zhed-packlist/src/serial.rs at line 115
}while it.next_if(|i| i.is_whitespace()).is_some() {}if multiplier.is_none() { - edit in crates/zhed-packlist/src/serial.rs at line 116
} else {while it.next_if(|i| i.is_whitespace()).is_some() {} - replacement in crates/zhed-packlist/src/serial.rs at line 120
Ok((ItemData {premarker,multiplier: multiplier.unwrap_or(1),}, it.collect()))Ok((ItemData {premarkers,multiplier: multiplier.unwrap_or(1),},it.collect(),)) - replacement in crates/zhed-packlist/src/serial.rs at line 138
writeln!(f)?;write!(f, "[{} ] ", sdata.summary.premarker)?;if sdata.summary.multiplier != 1 {write!(f, "{}x ", sdata.summary.multiplier)?;}writeln!(f, "# {}", section)?;writeln!(f, "\n{}# {}", sdata.summary, section)?; - replacement in crates/zhed-packlist/src/serial.rs at line 141
write!(f, "[{} ] ", item.0.premarker)?;if item.0.multiplier != 1 {write!(f, "{}x ", item.0.multiplier)?;}writeln!(f, "{}", item.1)?;writeln!(f, "{}{}", item.0, item.1)?; - edit in crates/zhed-packlist/src/serial.rs at line 143
}Ok(())}}impl fmt::Display for ItemData {fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {for i in &self.premarkers {write!(f, "[{} ] ", i)?; - edit in crates/zhed-packlist/src/serial.rs at line 153
if self.multiplier != 1 {write!(f, "{}x ", self.multiplier)?;} - edit in crates/zhed-packlist/src/serial.rs at line 163
- replacement in crates/zhed-packlist/src/serial.rs at line 184
sections.insert(String::new(), Section {summary: ItemData::default(),items: vec![(ItemData { premarker: ' ', multiplier: 1 }, "15 Ruß".to_string()),(ItemData { premarker: ' ', multiplier: 132 }, "Wattestäbe".to_string()),(ItemData { premarker: '#', multiplier: 0 }, "Handtuch".to_string()),],});sections.insert("Wachsbaum ...".to_string(), Section {summary: ItemData {premarker: '-',multiplier: 5000,sections.insert(String::new(),Section {summary: ItemData::default(),items: vec![(ItemData {premarkers: vec![' '],multiplier: 1,},"15 Ruß".to_string(),),(ItemData {premarkers: vec![' '],multiplier: 132,},"Wattestäbe".to_string(),),(ItemData {premarkers: vec!['#'],multiplier: 0,},"Handtuch".to_string(),),], - replacement in crates/zhed-packlist/src/serial.rs at line 212
items: vec![(ItemData { premarker: ' ', multiplier: 1 }, "Ranke".to_string()),(ItemData { premarker: '*', multiplier: 1 }, "5 x Metrik + BNaumbnd".to_string()),],}););sections.insert("Wachsbaum ...".to_string(),Section {summary: ItemData {premarkers: vec!['-'],multiplier: 5000,},items: vec![(ItemData {premarkers: vec![' '],multiplier: 1,},"Ranke".to_string(),),(ItemData {premarkers: vec!['*'],multiplier: 1,},"5 x Metrik + BNaumbnd".to_string(),),],},); - replacement in crates/zhed-packlist/src/serial.rs at line 250
assert_eq!("Packl (xyz) ...\n".parse::<PackList>(), Err(Error::DataAfterRangeSpec));assert_eq!("P\n[ ] # 1\n[ ] # 1\n".parse::<PackList>(), Err(Error::SectionOverwritten("1".to_string())));assert_eq!("P\n[ ]".parse::<PackList>(), Err(Error::InvalidItem("[ ]".to_string())));assert_eq!("Packl (xyz) ...\n".parse::<PackList>(),Err(Error::DataAfterRangeSpec));assert_eq!("P\n[ ] # 1\n[ ] # 1\n".parse::<PackList>(),Err(Error::SectionOverwritten("1".to_string())));assert_eq!("P\n[ ]".parse::<PackList>(),Err(Error::InvalidItem("[ ]".to_string())));}#[test]fn ex1() {let inp1 = r#"Packliste Ölland:[* ] [ _] [. ] 15 132x Ruß[* ] [ _] [. ] 132x Ruß"#;let inp2 = r#"Packliste Ölland[* ] [ ] [. ] 15 132x Ruß[* ] [ ] [. ] 132x Ruß"#;let mut sections = BTreeMap::new();sections.insert(String::new(),Section {summary: ItemData::default(),items: vec![(ItemData {premarkers: vec!['*', ' ', '.'],multiplier: 1,},"15 132x Ruß".to_string(),),(ItemData {premarkers: vec!['*', ' ', '.'],multiplier: 132,},"Ruß".to_string(),),],},);let res = PackList {name: "Packliste Ölland".to_string(),range: String::new(),sections,};assert_eq!(inp1.parse::<PackList>().unwrap(), res);assert_eq!(inp2.parse::<PackList>().unwrap(), res);assert_eq!(res.to_string(), inp2); - replacement in crates/zhed-packlist/src/lib.rs at line 21
pub premarker: char,pub premarkers: Vec<char>, - replacement in crates/zhed-packlist/src/lib.rs at line 28
premarker: ' ',premarkers: vec![' '], - replacement in crates/zhed-packlist/src/lib.rs at line 36
self.sections.values_mut().for_each(|sd| sd.reset_premarkers());self.sections.values_mut().for_each(|sd| sd.reset_premarkers()); - replacement in crates/zhed-packlist/src/lib.rs at line 44
self.summary.premarker = ' ';self.items.iter_mut().for_each(|item| item.0.premarker = ' ');core::iter::once(&mut self.summary).chain(self.items.iter_mut().map(|item| &mut item.0)).flat_map(|item| item.premarkers.iter_mut()).for_each(|i| *i = ' '); - replacement in crates/zhed-packlist/src/lib.rs at line 58
sections.insert(String::new(), Section {summary: ItemData::default(),items: vec![(ItemData { premarker: ' ', multiplier: 1 }, "15 Ruß".to_string()),(ItemData { premarker: ' ', multiplier: 132 }, "Wattestäbe".to_string()),(ItemData { premarker: '#', multiplier: 0 }, "Handtuch".to_string()),],});sections.insert("Wachsbaum ...".to_string(), Section {summary: ItemData {premarker: '-',multiplier: 5000,sections.insert(String::new(),Section {summary: ItemData::default(),items: vec![(ItemData {premarkers: vec![' '],multiplier: 1,},"15 Ruß".to_string(),),(ItemData {premarkers: vec![' '],multiplier: 132,},"Wattestäbe".to_string(),),(ItemData {premarkers: vec!['#'],multiplier: 0,},"Handtuch".to_string(),),], - replacement in crates/zhed-packlist/src/lib.rs at line 86
items: vec![(ItemData { premarker: ' ', multiplier: 1 }, "Ranke".to_string()),(ItemData { premarker: '*', multiplier: 1 }, "5 x Metrik + BNaumbnd".to_string()),],}););sections.insert("Wachsbaum ...".to_string(),Section {summary: ItemData {premarkers: vec!['-'],multiplier: 5000,},items: vec![(ItemData {premarkers: vec![' '],multiplier: 1,},"Ranke".to_string(),),(ItemData {premarkers: vec!['*'],multiplier: 1,},"5 x Metrik + BNaumbnd".to_string(),),],},); - replacement in crates/zhed-packlist/src/lib.rs at line 118
sections2.insert(String::new(), Section {summary: ItemData::default(),items: vec![(ItemData { premarker: ' ', multiplier: 1 }, "15 Ruß".to_string()),(ItemData { premarker: ' ', multiplier: 132 }, "Wattestäbe".to_string()),(ItemData { premarker: ' ', multiplier: 0 }, "Handtuch".to_string()),],});sections2.insert("Wachsbaum ...".to_string(), Section {summary: ItemData {premarker: ' ',multiplier: 5000,sections2.insert(String::new(),Section {summary: ItemData::default(),items: vec![(ItemData {premarkers: vec![' '],multiplier: 1,},"15 Ruß".to_string(),),(ItemData {premarkers: vec![' '],multiplier: 132,},"Wattestäbe".to_string(),),(ItemData {premarkers: vec![' '],multiplier: 0,},"Handtuch".to_string(),),],},);sections2.insert("Wachsbaum ...".to_string(),Section {summary: ItemData {premarkers: vec![' '],multiplier: 5000,},items: vec![(ItemData {premarkers: vec![' '],multiplier: 1,},"Ranke".to_string(),),(ItemData {premarkers: vec![' '],multiplier: 1,},"5 x Metrik + BNaumbnd".to_string(),),], - replacement in crates/zhed-packlist/src/lib.rs at line 171
items: vec![(ItemData { premarker: ' ', multiplier: 1 }, "Ranke".to_string()),(ItemData { premarker: ' ', multiplier: 1 }, "5 x Metrik + BNaumbnd".to_string()),],});); - replacement in crates/zhed-packlist/Cargo.toml at line 7
thiserror = "1.0.26"[3.3361]thiserror = "1.0"