51 lines
1.8 KiB
Rust
51 lines
1.8 KiB
Rust
use regex::Regex;
|
|
use std::env;
|
|
use std::fs::File;
|
|
use std::io::{BufRead, BufReader, Write};
|
|
use std::path::Path;
|
|
use walkdir::WalkDir;
|
|
|
|
fn main() {
|
|
let out_dir = env::var("OUT_DIR").unwrap();
|
|
let dest = Path::new(&out_dir).join("any_node.rs");
|
|
let mut out = File::create(&dest).unwrap();
|
|
|
|
let mut ref_node = String::new();
|
|
ref_node = format!("{}#[derive(Debug, Clone, RefNode)]\n", ref_node);
|
|
ref_node = format!("{}pub enum RefNode<'a> {{\n", ref_node);
|
|
ref_node = format!("{} Locate(&'a Locate),\n", ref_node);
|
|
|
|
let mut any_node = String::new();
|
|
any_node = format!("{}#[derive(Debug, Clone, AnyNode)]\n", any_node);
|
|
any_node = format!("{}pub enum AnyNode {{\n", any_node);
|
|
any_node = format!("{} Locate(Locate),\n", any_node);
|
|
|
|
let re_node = Regex::new(r"#\[derive.*Node.*\]").unwrap();
|
|
|
|
for entry in WalkDir::new("src") {
|
|
let entry = entry.unwrap();
|
|
if entry.file_type().is_file() {
|
|
let f = File::open(entry.path()).unwrap();
|
|
let f = BufReader::new(f);
|
|
let mut hit_node = false;
|
|
for line in f.lines() {
|
|
let line = line.unwrap();
|
|
if hit_node {
|
|
let name = line.split_whitespace().nth(2).unwrap().replace("<'a>", "");
|
|
ref_node = format!("{} {}(&'a {}),\n", ref_node, name, name);
|
|
any_node = format!("{} {}({}),\n", any_node, name, name);
|
|
hit_node = false;
|
|
}
|
|
if re_node.is_match(&line) {
|
|
hit_node = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
ref_node = format!("{}}}\n", ref_node);
|
|
any_node = format!("{}}}\n", any_node);
|
|
let _ = write!(out, "{}", ref_node);
|
|
let _ = write!(out, "{}", any_node);
|
|
}
|