use std::fs::write;
use std::path::PathBuf;
use anyhow::Result;
use cairo_vm::types::layout_name::LayoutName;
use clap::Parser;
use serde_json::to_string_pretty;
use stwo_cairo_adapter::ExecutionResources;
use stwo_cairo_dev_utils::vm_utils::{run_and_adapt, ProgramType};
use tracing::{span, Level};
use tracing_subscriber::fmt::format::FmtSpan;
#[derive(Parser, Debug)]
struct Args {
#[arg(long = "program")]
program: PathBuf,
#[arg(long = "program_type", default_value = "json")]
program_type: ProgramType,
#[arg(long = "program_arguments_file")]
program_arguments_file: Option<PathBuf>,
#[arg(long = "output")]
output: Option<PathBuf>,
}
fn main() -> Result<()> {
let args = Args::parse();
tracing_subscriber::fmt()
.with_span_events(FmtSpan::ENTER | FmtSpan::CLOSE)
.init();
let _span = span!(Level::INFO, "get_execution_resources").entered();
let prover_input = run_and_adapt(
&args.program,
args.program_type,
LayoutName::all_cairo_stwo,
args.program_arguments_file.as_ref(),
)?;
let execution_resources = ExecutionResources::from_prover_input(&prover_input);
log::info!("Execution resources: {execution_resources:#?}");
if let Some(output) = args.output {
let serialized = to_string_pretty(&execution_resources)?;
write(output, serialized)?;
}
Ok(())
}