use std::os::raw::c_char;
use serde::Deserialize;
use serde::Serialize;
use crate::ffi_apis::common::from_json_string;
use crate::ffi_apis::common::to_json_string;
use crate::symbolic::core::Expr;
use crate::symbolic::integral_equations::FredholmEquation;
use crate::symbolic::integral_equations::VolterraEquation;
use crate::symbolic::integral_equations::solve_airfoil_equation;
#[derive(Serialize, Deserialize)]
struct FredholmNeumannInput {
equation: FredholmEquation,
iterations: usize,
}
#[derive(Serialize, Deserialize)]
struct FredholmSeparableInput {
equation: FredholmEquation,
a_funcs: Vec<Expr>,
b_funcs: Vec<Expr>,
}
#[derive(Serialize, Deserialize)]
struct VolterraSuccessiveInput {
equation: VolterraEquation,
iterations: usize,
}
#[derive(Serialize, Deserialize)]
struct AirfoilInput {
f_x: Expr,
var_x: String,
var_t: String,
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_fredholm_solve_neumann_json(input_json: *const c_char) -> *mut c_char {
let input: Option<FredholmNeumannInput> = from_json_string(input_json);
let input = match input {
| Some(i) => i,
| None => {
return std::ptr::null_mut();
},
};
let result = input.equation.solve_neumann_series(input.iterations);
to_json_string(&result)
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_fredholm_solve_separable_json(input_json: *const c_char) -> *mut c_char {
let input: Option<FredholmSeparableInput> = from_json_string(input_json);
let input = match input {
| Some(i) => i,
| None => {
return std::ptr::null_mut();
},
};
match input
.equation
.solve_separable_kernel(&input.a_funcs, &input.b_funcs)
{
| Ok(result) => to_json_string(&result),
| Err(_) => std::ptr::null_mut(),
}
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_volterra_solve_successive_json(input_json: *const c_char) -> *mut c_char {
let input: Option<VolterraSuccessiveInput> = from_json_string(input_json);
let input = match input {
| Some(i) => i,
| None => {
return std::ptr::null_mut();
},
};
let result = input
.equation
.solve_successive_approximations(input.iterations);
to_json_string(&result)
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_volterra_solve_by_differentiation_json(
input_json: *const c_char
) -> *mut c_char {
let equation: Option<VolterraEquation> = from_json_string(input_json);
let equation = match equation {
| Some(e) => e,
| None => {
return std::ptr::null_mut();
},
};
match equation.solve_by_differentiation() {
| Ok(result) => to_json_string(&result),
| Err(_) => std::ptr::null_mut(),
}
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_solve_airfoil_equation_json(input_json: *const c_char) -> *mut c_char {
let input: Option<AirfoilInput> = from_json_string(input_json);
let input = match input {
| Some(i) => i,
| None => {
return std::ptr::null_mut();
},
};
let result = solve_airfoil_equation(&input.f_x, &input.var_x, &input.var_t);
to_json_string(&result)
}