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}