use crate::datamodel::DataModel;
use crate::exporters::Templates;
use crate::json::export::to_json_schema;
use crate::json::schema::SchemaObject;
use crate::validation::Validator;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(js_namespace = console)]
fn log(s: &str);
}
#[wasm_bindgen]
pub fn parse_model(markdown_content: &str) -> Result<DataModel, JsError> {
DataModel::from_markdown_string(markdown_content)
.map_err(|e| JsError::new(&format!("Error parsing markdown content: {e}")))
}
#[wasm_bindgen]
pub fn convert_to(markdown_content: &str, template: Templates) -> Result<String, JsValue> {
let mut model = DataModel::from_markdown_string(markdown_content)
.map_err(|e| JsValue::from_str(&format!("Error parsing markdown content: {e}")))?;
model
.convert_to(&template, None)
.map_err(|e| JsValue::from_str(&format!("Error converting markdown content: {e}")))
}
#[wasm_bindgen]
pub fn from_json_schema(json_schema: JsValue) -> Result<String, JsError> {
let schema: SchemaObject = serde_wasm_bindgen::from_value(json_schema)
.map_err(|e| JsError::new(&format!("Error deserializing JSON schema: {e}")))?;
let mut model = DataModel::from_json_schema_object(schema)
.map_err(|e| JsError::new(&format!("Error parsing JSON schema: {e}")))?;
model
.convert_to(&Templates::Markdown, None)
.map_err(|e| JsError::new(&format!("Error converting markdown content: {e}")))
}
#[wasm_bindgen]
pub fn json_schema(
markdown_content: &str,
root: Option<String>,
openai: bool,
) -> Result<String, JsValue> {
let model = DataModel::from_markdown_string(markdown_content)
.map_err(|e| JsValue::from_str(&format!("Error parsing markdown content: {e}")))?;
let root = match root {
Some(root) => root,
None => model
.objects
.first()
.ok_or(JsValue::from_str("No objects found in model"))?
.name
.clone(),
};
let json_schema = to_json_schema(&model, &root, openai)
.map_err(|e| JsValue::from_str(&format!("Error serializing schema: {e}")))?;
Ok(serde_json::to_string(&json_schema).unwrap())
}
#[wasm_bindgen]
pub fn validate(markdown_content: &str) -> Validator {
let model = DataModel::from_markdown_string(markdown_content);
match model {
Ok(_) => Validator::new(),
Err(res) => res,
}
}