bookdata/cleaning/names/
types.rs

1use 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}