Skip to main content

epub_parser/
parser.rs

1use quick_xml::events::Event;
2
3pub struct XmlParser;
4
5impl XmlParser {
6    pub fn extract_text<R: std::io::BufRead>(
7        reader: &mut quick_xml::Reader<R>,
8        buf: &mut Vec<u8>,
9    ) -> Result<Option<String>, Box<dyn std::error::Error>> {
10        let mut text = String::new();
11
12        loop {
13            match reader.read_event_into(buf) {
14                Ok(Event::Text(e)) => {
15                    text = e.unescape()?.into_owned();
16                    text = text.trim().to_string();
17                    if !text.is_empty() {
18                        break;
19                    }
20                }
21                Ok(Event::End(_)) => break,
22                Ok(Event::Eof) => break,
23                Err(e) => return Err(e.into()),
24                _ => {}
25            }
26            buf.clear();
27        }
28
29        Ok(if text.is_empty() { None } else { Some(text) })
30    }
31}