bookdata/cleaning/names/
types.rs1use thiserror::Error;
2
3#[derive(Error, Debug)]
4pub enum NameError {
5 #[error("Error parsing name entry: {0}")]
6 PEGError(#[from] peg::error::ParseError<peg::str::LineCol>),
7 #[error("Could not match {0}")]
8 #[allow(dead_code)]
9 Unmatched(String),
10}
11
12#[derive(Debug, PartialEq, Eq)]
13pub enum NameFmt {
14 Single(String),
15 TwoPart(String, String),
16 Empty,
17}
18
19impl NameFmt {
20 pub fn simplify(self) -> NameFmt {
21 match self {
22 NameFmt::TwoPart(l, f) => {
23 if f.is_empty() && l.is_empty() {
24 NameFmt::Empty
25 } else if f.is_empty() {
26 NameFmt::Single(l)
27 } else if l.is_empty() {
28 NameFmt::Single(f)
29 } else {
30 NameFmt::TwoPart(l, f)
31 }
32 }
33 NameFmt::Single(n) if n.is_empty() => NameFmt::Empty,
34 _ => self,
35 }
36 }
37}
38
39#[derive(Debug, PartialEq, Eq)]
40pub struct NameEntry {
41 pub name: NameFmt,
42 pub year: Option<String>,
43}
44
45impl From<(NameFmt, String)> for NameEntry {
46 fn from(t: (NameFmt, String)) -> NameEntry {
47 let (name, year) = t;
48 NameEntry {
49 name,
50 year: Some(year),
51 }
52 }
53}
54
55impl From<NameFmt> for NameEntry {
56 fn from(name: NameFmt) -> NameEntry {
57 NameEntry { name, year: None }
58 }
59}