use std::fs::File;
use std::io::{self, Read, Write};
use std::path::Path;
pub mod node;
pub mod parser;
pub use crate::node::Node;
pub use crate::parser::Parser;
pub type Document = node::element::SVG;
pub fn open<'l, T>(path: T, mut content: &'l mut String) -> io::Result<Parser<'l>>
where
T: AsRef<Path>,
{
let mut file = File::open(path)?;
file.read_to_string(&mut content)?;
read(content)
}
pub fn read<'l>(content: &'l str) -> io::Result<Parser<'l>> {
Ok(Parser::new(content))
}
pub fn save<T, U>(path: T, document: &U) -> io::Result<()>
where
T: AsRef<Path>,
U: Node,
{
let mut file = File::create(path)?;
file.write_all(&document.to_string().into_bytes())
}
pub fn write<T, U>(mut target: T, document: &U) -> io::Result<()>
where
T: Write,
U: Node,
{
target.write_all(&document.to_string().into_bytes())
}
#[cfg(test)]
mod tests {
use std::fs::File;
use std::io::Read;
use crate::parser::{Event, Parser};
const TEST_PATH: &'static str = "tests/fixtures/benton.svg";
#[test]
fn open() {
let mut content = String::new();
exercise(crate::open(self::TEST_PATH, &mut content).unwrap());
}
#[test]
fn read() {
let mut content = String::new();
let mut file = File::open(self::TEST_PATH).unwrap();
file.read_to_string(&mut content).unwrap();
exercise(crate::read(&content).unwrap());
}
fn exercise<'l>(mut parser: Parser<'l>) {
macro_rules! test(
($matcher:pat) => (match parser.next().unwrap() {
$matcher => {}
_ => unreachable!(),
});
);
test!(Event::Instruction);
test!(Event::Comment);
test!(Event::Declaration);
test!(Event::Tag("svg", _, _));
test!(Event::Tag("path", _, _));
test!(Event::Tag("path", _, _));
test!(Event::Tag("path", _, _));
test!(Event::Tag("path", _, _));
test!(Event::Tag("svg", _, _));
assert!(parser.next().is_none());
}
}