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::rewriting::RewriteRule;
use crate::symbolic::rewriting::apply_rules_to_normal_form;
use crate::symbolic::rewriting::knuth_bendix;
#[derive(Serialize, Deserialize)]
struct ApplyRulesInput {
expr: Expr,
rules: Vec<RewriteRule>,
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_apply_rules_to_normal_form_json(json_str: *const c_char) -> *mut c_char {
let input: Option<ApplyRulesInput> = from_json_string(json_str);
let input = match input {
| Some(i) => i,
| None => {
return std::ptr::null_mut();
},
};
let result = apply_rules_to_normal_form(&input.expr, &input.rules);
to_json_string(&result)
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_knuth_bendix_json(json_str: *const c_char) -> *mut c_char {
let equations: Option<Vec<Expr>> = from_json_string(json_str);
let equations = match equations {
| Some(e) => e,
| None => {
return std::ptr::null_mut();
},
};
match knuth_bendix(&equations) {
| Ok(rules) => to_json_string(&rules),
| Err(err) => {
let error_response = serde_json::json!({ "error": err });
to_json_string(&error_response)
},
}
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_rewrite_rule_new_json(json_str: *const c_char) -> *mut c_char {
#[derive(Deserialize)]
struct RuleInput {
lhs: Expr,
rhs: Expr,
}
let input: Option<RuleInput> = from_json_string(json_str);
let input = match input {
| Some(i) => i,
| None => {
return std::ptr::null_mut();
},
};
let rule = RewriteRule {
lhs: input.lhs,
rhs: input.rhs,
};
to_json_string(&rule)
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_rewrite_rule_to_string_json(json_str: *const c_char) -> *mut c_char {
let rule: Option<RewriteRule> = from_json_string(json_str);
let rule = match rule {
| Some(r) => r,
| None => {
return std::ptr::null_mut();
},
};
let rule_str = format!("{} -> {}", rule.lhs, rule.rhs);
let response = serde_json::json!({ "string": rule_str });
to_json_string(&response)
}