use std::fs::File;
use std::path::PathBuf;
use anyhow::Result;
use cairo_air::utils::ProofFormat;
use clap::Parser;
use serde_json::from_reader;
use stwo_cairo_adapter::ProverInput;
use stwo_cairo_prover::prover::create_and_serialize_proof;
use tracing::{span, Level};
use tracing_subscriber::fmt::format::FmtSpan;
#[derive(Parser, Debug)]
struct Args {
#[structopt(long = "prover_input_path")]
prover_input_path: PathBuf,
#[structopt(long = "params_json")]
proof_params_json: Option<PathBuf>,
#[structopt(long = "proof_path")]
proof_path: PathBuf,
#[arg(long, value_enum, default_value_t = ProofFormat::Json)]
proof_format: ProofFormat,
#[structopt(long = "verify")]
verify: bool,
}
fn main() -> Result<()> {
let args = Args::parse();
tracing_subscriber::fmt()
.with_span_events(FmtSpan::ENTER | FmtSpan::CLOSE)
.init();
let _span = span!(Level::INFO, "prove").entered();
let prover_input: ProverInput = from_reader(File::open(args.prover_input_path)?)?;
let result = create_and_serialize_proof(
prover_input,
args.verify,
args.proof_path,
args.proof_format,
args.proof_params_json,
);
match result {
Ok(_) => log::info!("✅ Proved successfully!"),
Err(ref e) => log::error!("❌ Proving failed: {e:?}"),
}
result
}