use cairo_vm::cairo_run::{cairo_run_program_with_initial_scope, CairoRunConfig};
use cairo_vm::hint_processor::hint_processor_definition::HintProcessor;
use cairo_vm::types::exec_scope::ExecutionScopes;
use cairo_vm::types::program::Program;
use cairo_vm::vm::errors::cairo_run_errors::CairoRunError;
use cairo_vm::vm::runners::cairo_runner::CairoRunner;
pub use hints::*;
use tracing::{span, Level};
pub mod hints;
pub mod tasks;
pub mod test_utils;
pub mod utils;
pub use utils::ProgramInput;
#[allow(clippy::result_large_err)]
pub fn cairo_run_program(
program: &Program,
program_input: Option<ProgramInput>,
cairo_run_config: CairoRunConfig<'_>,
extra_hint_processor: Option<&mut dyn HintProcessor>,
) -> Result<CairoRunner, CairoRunError> {
let _span = span!(Level::INFO, "cairo_run_program").entered();
let mut hint_processor = BootloaderHintProcessor::new(extra_hint_processor);
let mut exec_scopes = ExecutionScopes::new();
if let Some(program_input) = program_input {
exec_scopes.insert_value(PROGRAM_INPUT, program_input);
}
exec_scopes.insert_value(PROGRAM_OBJECT, program.clone());
let runner = cairo_run_program_with_initial_scope(
program,
&cairo_run_config,
&mut hint_processor,
exec_scopes,
)?;
Ok(runner)
}