Skip to content

Commit 3a63c3e

Browse files
add write_output_to_file func to cairo-program-runner-lib
1 parent aa1753e commit 3a63c3e

File tree

4 files changed

+31
-41
lines changed

4 files changed

+31
-41
lines changed

crates/cairo-program-runner-lib/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ edition = "2021"
55

66

77
[dependencies]
8+
anyhow.workspace = true
89
bincode.workspace = true
910
cairo-vm.workspace = true
1011
cairo-lang-executable.workspace = true
@@ -15,6 +16,7 @@ clap.workspace = true
1516
num-traits.workspace = true
1617
serde.workspace = true
1718
serde_json.workspace = true
19+
sonic-rs.workspace = true
1820
starknet-crypto.workspace = true
1921
starknet-types-core.workspace = true
2022
thiserror.workspace = true

crates/cairo-program-runner-lib/src/utils.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ use cairo_vm::{
99
errors::program_errors::ProgramError, layout::CairoLayoutParams, layout_name::LayoutName,
1010
program::Program,
1111
},
12+
vm::runners::cairo_runner::CairoRunner,
13+
Felt252,
1214
};
1315

1416
use crate::types::RunMode;
@@ -115,3 +117,18 @@ pub fn get_cairo_run_config(
115117
.create_config()
116118
})
117119
}
120+
121+
/// Write the program output to the specified output path as Felt252 values.
122+
pub fn write_output_to_file(runner: &mut CairoRunner, output_path: PathBuf) -> anyhow::Result<()> {
123+
let mut output_buffer = String::new();
124+
runner.vm.write_output(&mut output_buffer)?;
125+
let output_lines = output_buffer
126+
.lines()
127+
.map(|line| {
128+
Felt252::from_dec_str(line)
129+
.map_err(|_| anyhow::anyhow!("Failed to parse output line as Felt decimal: {line}"))
130+
})
131+
.collect::<Result<Vec<Felt252>, anyhow::Error>>()?;
132+
std::fs::write(&output_path, sonic_rs::to_string_pretty(&output_lines)?)?;
133+
Ok(())
134+
}

crates/cairo-program-runner/src/bin/cairo_program_runner/main.rs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ use std::io::{self, Write};
44
use std::path::PathBuf;
55

66
use bincode::enc::write::Writer;
7-
use cairo_program_runner_lib::utils::{get_cairo_run_config, get_program, get_program_input};
7+
use cairo_program_runner_lib::utils::{
8+
get_cairo_run_config, get_program, get_program_input, write_output_to_file,
9+
};
810
use cairo_vm::types::layout_name::LayoutName;
911

1012
use cairo_program_runner_lib::cairo_run_program;
13+
use cairo_vm::cairo_run;
1114
use cairo_vm::vm::errors::cairo_run_errors::CairoRunError;
12-
use cairo_vm::{cairo_run, Felt252};
1315
use clap::Parser;
1416
use tempfile::NamedTempFile;
1517

@@ -167,16 +169,7 @@ fn main() -> Result<(), Box<dyn Error>> {
167169

168170
// Handle program output file if specified
169171
if let Some(outputs_file) = args.outputs_file {
170-
let mut output_buffer = String::new();
171-
runner.vm.write_output(&mut output_buffer)?;
172-
let output_lines = output_buffer
173-
.lines()
174-
.map(|line| {
175-
Felt252::from_dec_str(line)
176-
.map_err(|_| format!("Failed to parse output line as Felt decimal: {line}"))
177-
})
178-
.collect::<Result<Vec<Felt252>, _>>()?;
179-
std::fs::write(outputs_file, serde_json::to_string_pretty(&output_lines)?)?;
172+
write_output_to_file(&mut runner, outputs_file)?;
180173
}
181174

182175
// Handle execution resources file if specified

crates/stwo_run_and_prove/src/main.rs

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
use anyhow::Result;
22
use cairo_air::utils::ProofFormat;
33
use cairo_program_runner_lib::cairo_run_program;
4-
use cairo_program_runner_lib::utils::{get_cairo_run_config, get_program, get_program_input};
5-
use cairo_vm::Felt252;
4+
use cairo_program_runner_lib::utils::{
5+
get_cairo_run_config, get_program, get_program_input, write_output_to_file,
6+
};
67
use cairo_vm::types::errors::program_errors::ProgramError;
78
use cairo_vm::types::layout_name::LayoutName;
89
use cairo_vm::vm::errors::cairo_run_errors::CairoRunError;
910
use cairo_vm::vm::errors::runner_errors::RunnerError;
1011
use cairo_vm::vm::errors::vm_errors::VirtualMachineError;
11-
use cairo_vm::vm::runners::cairo_runner::CairoRunner;
1212
use clap::Parser;
1313
#[cfg(test)]
1414
use mockall::automock;
@@ -87,8 +87,6 @@ enum StwoRunAndProveError {
8787
Serializing(#[from] sonic_rs::error::Error),
8888
#[error(transparent)]
8989
VM(#[from] VirtualMachineError),
90-
#[error("Failed to parse output line as Felt decimal.")]
91-
OutputParsing,
9290
#[error(transparent)]
9391
Anyhow(#[from] anyhow::Error),
9492
}
@@ -166,7 +164,7 @@ fn stwo_run_and_prove(
166164
.map_err(|e| StwoRunAndProveError::Program(e, program_path))?;
167165
let program_input = get_program_input(&program_input)
168166
.map_err(|e| StwoRunAndProveError::PathIO(e, program_input.unwrap_or_default()))?;
169-
let runner = cairo_run_program(&program, program_input, cairo_run_config)?;
167+
let mut runner = cairo_run_program(&program, program_input, cairo_run_config)?;
170168
let prover_input = adapt(&runner)?;
171169
let result = prove(prover_input.clone(), prove_config, prover);
172170

@@ -186,7 +184,8 @@ fn stwo_run_and_prove(
186184
if let Some(output_path) = program_output
187185
&& result.is_ok()
188186
{
189-
write_output_to_file(runner, output_path)?;
187+
info!("Saving program output to: {:?}", output_path);
188+
write_output_to_file(&mut runner, output_path)?;
190189
}
191190

192191
result
@@ -261,28 +260,6 @@ impl ProverTrait for StwoProverEntryPoint {
261260
}
262261
}
263262

264-
/// Write the program output to the specified output path as Felt252 values.
265-
fn write_output_to_file(
266-
mut runner: CairoRunner,
267-
output_path: PathBuf,
268-
) -> Result<(), StwoRunAndProveError> {
269-
info!("Saving program output to: {:?}", output_path);
270-
// TODO(Nitsan): move this function to cairo_program_runner_lib or a new utils lib,
271-
// and call it from here and from cairo_program_runner.
272-
273-
let mut output_buffer = String::new();
274-
runner.vm.write_output(&mut output_buffer)?;
275-
let output_lines = output_buffer
276-
.lines()
277-
.map(|line: &str| {
278-
Felt252::from_dec_str(line).map_err(|_| StwoRunAndProveError::OutputParsing)
279-
})
280-
.collect::<Result<Vec<Felt252>, _>>()?;
281-
std::fs::write(&output_path, sonic_rs::to_string_pretty(&output_lines)?)
282-
.map_err(|e| StwoRunAndProveError::PathIO(e, output_path))?;
283-
Ok(())
284-
}
285-
286263
fn file_empty(path: &PathBuf) -> std::io::Result<bool> {
287264
let metadata = fs::metadata(path)?;
288265
Ok(metadata.len() == 0)
@@ -302,6 +279,7 @@ fn file_missing_or_empty(path: &PathBuf) -> std::io::Result<bool> {
302279
#[cfg(test)]
303280
mod tests {
304281
use super::*;
282+
use cairo_vm::Felt252;
305283
use ctor::ctor;
306284
use serde_json::Value;
307285
use stwo_cairo_utils::logging_utils::init_logging;

0 commit comments

Comments
 (0)