use std::fs::File;
use std::io::{self, Read, Write};
use std::path::Path;
pub mod node;
pub mod parser;
pub use node::Node;
pub use parser::Parser;
pub type Document = node::element::SVG;
pub fn open<'l, T>(path: T) -> io::Result<Parser<'l>>
where
T: AsRef<Path>,
{
let mut file = File::open(path)?;
read_internal(&mut file)
}
pub fn read<'l, T>(source: T) -> io::Result<Parser<'l>>
where
T: Read,
{
read_internal(source)
}
pub fn save<T, U>(path: T, document: &U) -> io::Result<()>
where
T: AsRef<Path>,
U: Node,
{
let mut file = File::create(path)?;
write_internal(&mut file, document)
}
pub fn write<T, U>(target: T, document: &U) -> io::Result<()>
where
T: Write,
U: Node,
{
write_internal(target, document)
}
#[inline(always)]
fn read_internal<'l, R>(mut source: R) -> io::Result<Parser<'l>>
where
R: Read,
{
let mut content = String::new();
source.read_to_string(&mut content)?;
Ok(Parser::new(content))
}
#[inline(always)]
fn write_internal<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 parser::{Event, Parser};
const TEST_PATH: &'static str = "tests/fixtures/benton.svg";
#[test]
fn open() {
exercise(::open(self::TEST_PATH).unwrap());
}
#[test]
fn read() {
exercise(::read(&mut File::open(self::TEST_PATH).unwrap()).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());
}
}