svgparser 0.6.0

Featureful, pull-based, zero-allocation SVG parser.
Documentation
extern crate svgparser;
extern crate criterion;

use std::fs;
use std::env;
use std::io::Read;

use criterion::Criterion;

use svgparser::{svg, path, AttributeId, FromSpan};

fn load_file(path: &str) -> String {
    let path = env::current_dir().unwrap().join(path);
    let mut file = fs::File::open(&path).unwrap();
    let mut text = String::new();
    file.read_to_string(&mut text).unwrap();
    text
}

fn collect_paths(text: &str) -> Vec<String> {
    let mut paths = Vec::new();
    for token in svg::Tokenizer::from_str(text) {
        if let svg::Token::Attribute(name, value) = token.unwrap() {
            if let svg::Name::Svg(AttributeId::D) = name {
                paths.push(value.to_str().to_owned());
            }
        }
    }

    paths
}

fn parse_paths(paths: &[String]) {
    for path in paths {
        for _ in path::Tokenizer::from_str(path) {}
    }
}

#[test]
fn criterion_benchmark() {
    let text = load_file("benches/Jupiter_diagram.svg");
    let paths = collect_paths(&text);
    Criterion::default().bench_function("paths", |b| b.iter(|| parse_paths(&paths)));
}