gosyn 0.2.10

Golang syntax parser in Rust
Documentation
mod walkdir;
use walkdir::Walkdir;

use gosyn::parse_dir;
use gosyn::Parser;

use std::env;
use std::fs;
use std::path::Path;
use std::path::PathBuf;
use std::time::{Duration, Instant};

fn parse_source<P: AsRef<Path>>(path: P) -> anyhow::Result<Duration> {
    let clock = Instant::now();
    Parser::from_file(path)?
        .parse_file()
        .map(|_| clock.elapsed())
}

#[test]
fn pprof_parser() -> anyhow::Result<()> {
    let dir = match env::var("GOSYN_PPROF_TEST") {
        Ok(path) => path,
        _ => return Ok(()),
    };

    let mut wlk = Walkdir::new(&dir)?.with_ext([".go"], [])?;
    let guard = pprof::ProfilerGuard::new(1000).unwrap();

    let mut total = Duration::from_millis(0);
    while let Some(path) = wlk.next_file()? {
        let elapsed = parse_source(&path)?;
        println!("  {:?} {:?}ms", &path, elapsed.as_millis());
        total += elapsed;
    }

    println!("{:?} total elapsed {:?}ms", &dir, total.as_millis());

    let report = guard.report().build().unwrap();
    let file = fs::File::create("flamegraph.svg").unwrap();
    report.flamegraph(file).unwrap();

    Ok(())
}

#[test]
fn test_third_party_projects() -> anyhow::Result<()> {
    match env::var("GOSYN_THIRD_PARTY") {
        Ok(val) => val.split(";").try_for_each(|dir| -> anyhow::Result<()> {
            let mut walk = Walkdir::new(dir)?.with_ext([".go"], [".pb.go"])?;
            println!("parsing {} ...", dir);
            while let Some(path) = walk.next_file()? {
                println!(
                    "  {}: {}μs",
                    path.as_path().strip_prefix(dir).unwrap().display(),
                    parse_source(&path)?.as_micros(),
                );
            }
            Ok(())
        }),
        _ => Ok(()),
    }
}

#[test]
fn test_parse_directory() -> anyhow::Result<()> {
    let root = match env::var("GOSYN_TEST_DIR") {
        Ok(dir) => PathBuf::from(dir),
        _ => return Ok(()),
    };

    for (name, pkg) in parse_dir(root)? {
        println!("package {}:", name);
        for file in pkg.files {
            println!("  {:?}", &file.path);
        }
    }

    Ok(())
}