use std::os::raw::c_char;
use serde::Serialize;
use crate::ffi_apis::common::from_json_string;
use crate::ffi_apis::common::to_c_string;
use crate::ffi_apis::ffi_api::FfiResult;
use crate::physics::physics_sim::ising_statistical::IsingParameters;
use crate::physics::physics_sim::ising_statistical::{
self,
};
#[derive(Serialize)]
struct IsingOutput {
pub grid: Vec<i8>,
pub magnetization: f64,
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_physics_sim_ising_run_json(input: *const c_char) -> *mut c_char {
let params: IsingParameters = match from_json_string(input) {
| Some(p) => p,
| None => {
return to_c_string(
serde_json::to_string(&FfiResult::<IsingOutput, String>::err(
"Invalid JSON".to_string(),
))
.unwrap(),
);
},
};
let (grid, magnetization) = ising_statistical::run_ising_simulation(¶ms);
let out = IsingOutput { grid, magnetization };
to_c_string(serde_json::to_string(&FfiResult::<IsingOutput, String>::ok(out)).unwrap())
}