use std::fs::File;
use std::io::{Read, Result, 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<T>(path: T, content: &'_ mut String) -> Result<Parser<'_>>
where
T: AsRef<Path>,
{
let mut file = File::open(path)?;
file.read_to_string(content)?;
read(content)
}
pub fn read(content: &'_ str) -> Result<Parser<'_>> {
Ok(Parser::new(content))
}
pub fn save<T, U>(path: T, document: &U) -> 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) -> 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());
}
}