Skip to main content

cargo_svg_defs/
lib.rs

1extern crate quick_xml;
2
3use quick_xml::*;
4use quick_xml::events::*;
5
6use std::path::*;
7use std::io::*;
8use std::fs::*;
9
10#[derive(Debug)]
11pub enum Error {
12    Xml(quick_xml::Error),
13    Io(std::io::Error),
14}
15
16pub type Result<T> = std::result::Result<T, Error>;
17
18pub fn parse_dir(dir: &AsRef<Path>, target: &AsRef<Path>) -> Result<()> {
19    let target = File::create(target).map_err(Error::Io)?;
20    let mut writer = Writer::new(target);
21    write_start(&mut writer).map_err(Error::Xml)?;
22    for entry in read_dir(dir).map_err(Error::Io)? {
23        let dir = entry.map_err(Error::Io)?;
24        if !dir.path().is_file() {
25            continue;
26        }
27        let mut reader = Reader::from_file(dir.path()).map_err(Error::Xml)?;
28        reader.trim_text(true);
29        let mut buf = Vec::new();
30        write_symbol_start(&mut writer, dir.path().file_name().unwrap_or_default().to_str().unwrap_or_default()).map_err(Error::Xml)?;
31        loop {
32            match reader.read_event(&mut buf) {
33                Ok(Event::Start(e)) => {
34                    if e.name() != b"?xml" {
35                        // writes the event to the writer
36                        writer.write_event(Event::Start(e)).map_err(Error::Xml)?;
37                    }
38                }
39                Ok(Event::End(e)) => {
40                    if e.name() != b"?xml" {
41                        writer.write_event(Event::End(e)).map_err(Error::Xml)?;
42                    }
43                }
44                Ok(Event::Eof) => break,
45                // you can use either `e` or `&e` if you don't want to move the event
46                Ok(e) => {
47                    writer.write_event(&e).map_err(Error::Xml)?;
48                },
49                Err(e) => return Err(Error::Xml(e)),
50            }
51            buf.clear();
52        }
53        write_symbol_end(&mut writer).map_err(Error::Xml)?;
54    }
55    write_end(&mut writer).map_err(Error::Xml)?;
56    Ok(())
57}
58
59fn write_start<T: Write>(writer: &mut Writer<T>) -> quick_xml::Result<usize> {
60    let mut elem = BytesStart::borrowed_name(b"svg");
61    elem.push_attribute(("xmlns", "http://www.w3.org/2000/svg"));
62    writer.write_event(Event::Start(elem))?;
63    writer.write_event(Event::Start(BytesStart::borrowed_name(b"defs")))
64}
65
66fn write_end<T: Write>(writer: &mut Writer<T>) -> quick_xml::Result<usize> {
67    writer.write_event(Event::End(BytesEnd::borrowed(b"defs")))?;
68    writer.write_event(Event::End(BytesEnd::borrowed(b"svg")))
69}
70
71fn write_symbol_start<T: Write>(writer: &mut Writer<T>, id: &str) -> quick_xml::Result<usize> {
72    let mut elem = BytesStart::borrowed_name(b"symbol");
73    elem.push_attribute(("id", id));
74    writer.write_event(Event::Start(elem))
75}
76
77fn write_symbol_end<T: Write>(writer: &mut Writer<T>) -> quick_xml::Result<usize> {
78    writer.write_event(Event::End(BytesEnd::borrowed(b"symbol")))
79}
80
81#[test]
82fn test_() {
83    parse_dir(&"./svgs", &"defs.svg").unwrap();
84}