#![recursion_limit = "256"]
use clap::Parser;
use lalrpop_util::lalrpop_mod;
use miette::IntoDiagnostic;
use owo_colors::OwoColorize;
lalrpop_mod! {
#[allow(warnings)]
pub rinha
}
pub mod ast;
pub mod parser;
#[derive(clap::Parser, Debug)]
#[command(author, version, about, long_about = None)]
#[command(propagate_version = true)]
pub struct Command {
#[clap(long, short, default_value = "false")]
pub pretty: bool,
pub main: String,
}
pub fn log(out: fern::FormatCallback, message: &std::fmt::Arguments, record: &log::Record) {
let style = match record.level() {
log::Level::Error => owo_colors::Style::new().red().bold(),
log::Level::Warn => owo_colors::Style::new().yellow().bold(),
log::Level::Info => owo_colors::Style::new().bright_blue().bold(),
log::Level::Debug => owo_colors::Style::new().bright_red().bold(),
log::Level::Trace => owo_colors::Style::new().bright_cyan().bold(),
};
let level = record.level().to_string().to_lowercase();
let level = level.style(style);
out.finish(format_args!(" {level:>7} {}", message))
}
pub fn program() -> miette::Result<()> {
bupropion::BupropionHandlerOpts::install(|| {
bupropion::BupropionHandlerOpts::new()
})
.into_diagnostic()?;
fern::Dispatch::new() .format(log) .level(log::LevelFilter::Debug) .level_for("hyper", log::LevelFilter::Info) .chain(std::io::stdout())
.apply()
.into_diagnostic()?;
let command = Command::parse();
let file = std::fs::read_to_string(&command.main).into_diagnostic()?;
let file = crate::parser::parse_or_report(&command.main, &file)?;
let json = if command.pretty {
serde_json::to_string_pretty(&file).into_diagnostic()?
} else {
serde_json::to_string(&file).into_diagnostic()?
};
println!("{json}");
Ok(())
}