disco_quick/
company.rs

1use crate::parser::{Parser, ParserError};
2use crate::util::maybe_text;
3use quick_xml::events::Event;
4use std::mem::take;
5
6#[derive(Debug, Default)]
7pub struct CompanyParser {
8    state: ParserState,
9    pub current_item: ReleaseCompany,
10    pub item_ready: bool,
11}
12
13#[derive(Clone, Debug, Default, PartialEq, Eq)]
14#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15pub struct ReleaseCompany {
16    pub id: Option<u32>,
17    pub name: String,
18    pub catno: Option<String>,
19    pub entity_type: u8,
20    pub entity_type_name: String,
21}
22
23#[derive(Debug, Default)]
24enum ParserState {
25    #[default]
26    Company,
27    Id,
28    Name,
29    Catno,
30    EntityType,
31    EntityTypeName,
32}
33
34impl Parser for CompanyParser {
35    type Item = ReleaseCompany;
36    fn new() -> Self {
37        Self::default()
38    }
39
40    fn take(&mut self) -> ReleaseCompany {
41        self.item_ready = false;
42        take(&mut self.current_item)
43    }
44    fn process(&mut self, ev: &Event) -> Result<(), ParserError> {
45        self.state = match self.state {
46            ParserState::Company => match ev {
47                Event::Start(e) => match e.local_name().as_ref() {
48                    b"id" => ParserState::Id,
49                    b"name" => ParserState::Name,
50                    b"catno" => ParserState::Catno,
51                    b"entity_type" => ParserState::EntityType,
52                    b"entity_type_name" => ParserState::EntityTypeName,
53                    _ => ParserState::Company,
54                },
55
56                Event::End(e) if e.local_name().as_ref() == b"company" => {
57                    self.item_ready = true;
58                    ParserState::Company
59                }
60                _ => ParserState::Company,
61            },
62
63            ParserState::Id => match ev {
64                Event::Text(e) => {
65                    self.current_item.id = Some(e.unescape()?.parse()?);
66                    ParserState::Company
67                }
68                _ => ParserState::Company,
69            },
70
71            ParserState::Name => match ev {
72                Event::Text(e) => {
73                    self.current_item.name = e.unescape()?.to_string();
74                    ParserState::Company
75                }
76                _ => ParserState::Company,
77            },
78
79            ParserState::Catno => match ev {
80                Event::Text(e) => {
81                    self.current_item.catno = maybe_text(e)?;
82                    ParserState::Company
83                }
84                _ => ParserState::Company,
85            },
86
87            ParserState::EntityType => match ev {
88                Event::Text(e) => {
89                    self.current_item.entity_type = e.unescape()?.parse()?;
90                    ParserState::Company
91                }
92                _ => ParserState::Company,
93            },
94
95            ParserState::EntityTypeName => match ev {
96                Event::Text(e) => {
97                    self.current_item.entity_type_name = e.unescape()?.to_string();
98                    ParserState::Company
99                }
100                _ => ParserState::Company,
101            },
102        };
103        Ok(())
104    }
105}