36 lines
1.1 KiB
Rust
36 lines
1.1 KiB
Rust
use fidc_core::factor_events::{self, Expr, Frame};
|
|
use serde::Deserialize;
|
|
use serde_json::{Value, json};
|
|
use std::io::{self, Read};
|
|
|
|
#[derive(Deserialize)]
|
|
#[serde(deny_unknown_fields)]
|
|
struct Request {
|
|
expressions: std::collections::BTreeMap<String, Expr>,
|
|
frame: Frame,
|
|
}
|
|
|
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
let mut input = String::new();
|
|
io::stdin().read_to_string(&mut input)?;
|
|
let output = if input.trim().is_empty() {
|
|
factor_events::catalog()
|
|
} else {
|
|
let request: Request = serde_json::from_str(&input)?;
|
|
let results = request
|
|
.expressions
|
|
.iter()
|
|
.map(|(id, expr)| {
|
|
let result = match factor_events::evaluate(expr, &request.frame) {
|
|
Ok(v) => json!({"result":v}),
|
|
Err(e) => json!({"error":e}),
|
|
};
|
|
(id.clone(), result)
|
|
})
|
|
.collect::<std::collections::BTreeMap<String, Value>>();
|
|
json!({"contract":factor_events::CONTRACT,"results":results,"read_only":true})
|
|
};
|
|
println!("{}", serde_json::to_string(&output)?);
|
|
Ok(())
|
|
}
|