arcis_interface/
lib.rs

1mod json;
2mod string;
3mod types;
4
5pub use json::ManticoreInterface;
6use std::{env, io::Write};
7pub use types::{CircuitInterface, Value};
8
9pub fn write_interface(
10    interface: String,
11    circuit_name: &str,
12    out_dir: &Option<String>,
13) -> Result<(), std::io::Error> {
14    use crate::string::snake_case_to_camel_case;
15
16    const DEFAULT_CIRCUIT_OUT_DIR: &str = "build";
17
18    let current_dir = env::current_dir()?;
19
20    let circuits_dir = current_dir.join(out_dir.as_deref().unwrap_or(DEFAULT_CIRCUIT_OUT_DIR));
21    let file_path = circuits_dir.join(format!("{circuit_name}.idarc"));
22    let ts_file_path = circuits_dir.join(format!("{circuit_name}.ts"));
23
24    std::fs::create_dir_all(&circuits_dir)?;
25
26    let mut file = std::fs::File::create(file_path)?;
27    let interface_bytes = interface.into_bytes();
28    file.write_all(&interface_bytes)?;
29
30    let mut ts_file = std::fs::File::create(ts_file_path)?;
31    // Write the TypeScript interface with the circuit name in camel case (from snake case)
32    let camel_case_name = snake_case_to_camel_case(circuit_name);
33    ts_file.write_all(
34        &[
35            &format!("export type {} = ", camel_case_name).into_bytes()[..],
36            &interface_bytes[..],
37        ]
38        .concat(),
39    )?;
40
41    Ok(())
42}