mod ast; mod checker; mod checker_set; mod checker_signature; mod checker_state; mod parser; use std::env; use std::fs; use std::process; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; use tracing_tree::HierarchicalLayer; fn main() { let args: Vec = env::args().skip(1).collect(); if args.is_empty() { eprintln!("Usage: makkai [--debug] [file.makkai ...]"); process::exit(1); } let debug_mode = args.first().map_or(false, |arg| arg == "--debug"); if debug_mode { tracing_subscriber::registry() .with( HierarchicalLayer::new(2) .with_targets(false) .with_bracketed_fields(true), ) .init(); } let files: Vec = if debug_mode { args.into_iter().skip(1).collect() } else { args }; if files.is_empty() { eprintln!("Usage: makkai [--debug] [file.makkai ...]"); process::exit(1); } for file in files { let src = match fs::read_to_string(&file) { Ok(content) => content, Err(e) => { let msg = match e.kind() { std::io::ErrorKind::NotFound => "file not found".to_string(), _ => format!("io error: {}", e), }; eprintln!("{}: {}", file, msg); process::exit(1); } }; let programme = match parser::parse_result(&src) { Ok(p) => p, Err(parse_err) => { eprintln!("{}: Error\n\t{}", file, parse_err); process::exit(1); } }; if let Err(check_err) = programme.check() { eprintln!("{} Error\n\t{}", file, check_err); process::exit(1); } else { println!("{} Ok", file); } } }