mylib/
lib.rs

1use serde_json::{from_str, to_string, Value};
2use std::ffi::{CStr, CString};
3use std::os::raw::c_char;
4
5fn parse_json_string(json_str: &str) -> Result<String, String> {
6    let parsed_json = from_str(json_str).map_err(|e| format!("Failed to parse JSON: {}", e))?;
7
8    let result = to_string(&parsed_json).map_err(|e| format!("Failed to serialize JSON: {}", e))?;
9
10    Ok(result)
11}
12
13#[no_mangle]
14pub unsafe extern "C" fn parse_json(input: *const c_char) -> *mut c_char {
15    let input_str = match CStr::from_ptr(input).to_str() {
16        Ok(str) => str,
17        Err(_) => return CString::new("").unwrap().into_raw(),
18    };
19
20    match parse_json_string(input_str) {
21        Ok(result) => CString::new(result)
22            .map(|s| s.into_raw())
23            .unwrap_or_else(|_| CString::new("").unwrap().into_raw()),
24        Err(err) => CString::new(err)
25            .map(|s| s.into_raw())
26            .unwrap_or_else(|_| CString::new("").unwrap().into_raw()),
27    }
28}