use nibli_engine::NibliEngine;
use std::io::{self, BufRead};
use std::process::ExitCode;
fn main() -> ExitCode {
let engine = NibliEngine::new();
let stdin = io::stdin();
for line in stdin.lock().lines() {
let line = match line {
Ok(l) => l,
Err(_) => break,
};
let trimmed = line.trim();
if trimmed.is_empty() {
continue;
}
engine.reset();
match engine.assert_text(trimmed) {
Ok(_fact_id) => {
let escaped_line = escape_json(trimmed);
println!(r#"{{"line":"{}","valid":true}}"#, escaped_line);
}
Err(e) => {
let escaped_line = escape_json(trimmed);
let escaped_err = escape_json(&e.to_string());
println!(
r#"{{"line":"{}","valid":false,"error":"{}"}}"#,
escaped_line, escaped_err
);
}
}
}
ExitCode::SUCCESS
}
fn escape_json(s: &str) -> String {
let mut out = String::with_capacity(s.len());
for c in s.chars() {
match c {
'"' => out.push_str(r#"\""#),
'\\' => out.push_str(r#"\\"#),
'\n' => out.push_str(r#"\n"#),
'\r' => out.push_str(r#"\r"#),
'\t' => out.push_str(r#"\t"#),
c => out.push(c),
}
}
out
}