mod context;
mod parser;
mod value;
pub use parser::RepairOptions;
pub use value::JsonValue;
use parser::JsonParser;
pub fn repair_json(json_str: &str, options: &RepairOptions) -> Result<String, JsonRepairError> {
let value = loads(json_str, options)?;
if let JsonValue::String(s) = &value {
if s.is_empty() {
return Ok(String::new());
}
}
Ok(value.to_json_string_with_options(options.ensure_ascii))
}
pub fn loads(json_str: &str, options: &RepairOptions) -> Result<JsonValue, JsonRepairError> {
if !options.skip_json_loads {
if let Ok(value) = serde_json::from_str::<serde_json::Value>(json_str) {
return Ok(JsonValue::from(value));
}
}
let mut parser = JsonParser::new(json_str, options);
parser.parse()
}
#[derive(Debug, thiserror::Error)]
pub enum JsonRepairError {
#[error("JSON serialization error: {0}")]
SerializationError(#[from] serde_json::Error),
#[error("Strict mode violation: {0}")]
StrictModeError(String),
#[error("Parse error: {0}")]
ParseError(String),
}
#[cfg(test)]
mod tests;