use std::fs;
use std::path::PathBuf;
use anyhow::Context;
use cairo_lang_compiler::project::check_compiler_path;
use cairo_lang_compiler::{CompilerConfig, compile_cairo_project_at_path};
use cairo_lang_utils::logging::init_logging;
use clap::Parser;
#[cfg(feature = "mimalloc")]
#[global_allocator]
static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, clap::ValueEnum)]
pub enum InliningStrategy {
#[default]
Default,
Avoid,
}
impl From<crate::InliningStrategy> for cairo_lang_lowering::utils::InliningStrategy {
fn from(value: crate::InliningStrategy) -> Self {
match value {
InliningStrategy::Default => cairo_lang_lowering::utils::InliningStrategy::Default,
InliningStrategy::Avoid => cairo_lang_lowering::utils::InliningStrategy::Avoid,
}
}
}
#[derive(Parser, Debug)]
#[command(version, verbatim_doc_comment)]
struct Args {
path: PathBuf,
#[arg(short, long)]
single_file: bool,
output: Option<String>,
#[arg(short, long, default_value_t = false)]
replace_ids: bool,
#[arg(short, long, default_value = "default")]
inlining_strategy: InliningStrategy,
}
fn main() -> anyhow::Result<()> {
init_logging(tracing::Level::ERROR);
log::info!("Starting Cairo compilation.");
let args = Args::parse();
check_compiler_path(args.single_file, &args.path)?;
let sierra_program = compile_cairo_project_at_path(
&args.path,
CompilerConfig { replace_ids: args.replace_ids, ..CompilerConfig::default() },
args.inlining_strategy.into(),
)?;
match args.output {
Some(path) => {
fs::write(path, sierra_program.to_string()).context("Failed to write output.")?
}
None => println!("{sierra_program}"),
}
Ok(())
}