flowstdlib 1.0.0

The standard library of functions and flows for 'flow' programs
Documentation
use flowcore::errors::Result;
use flowcore::flow_output;
use flowcore::RunAgain;
use flowmacro::flow_function;
use serde_json::{json, Value};

#[flow_function]
fn inner_min(value: &Value, partial: &Value) -> Result<(Option<Value>, RunAgain)> {
    if value.is_null() {
        return flow_output!("result" => partial.clone());
    }

    let v = value.as_f64().ok_or("value not f64")?;
    let r = partial.as_f64().ok_or("partial not f64")?;
    let new_min = if v < r { v } else { r };

    flow_output!("partial" => json!(new_min))
}

#[cfg(test)]
#[allow(clippy::unwrap_used, clippy::expect_used)]
mod test {
    use super::inner_min;
    use serde_json::json;

    #[test]
    fn tracks_minimum() {
        let (r, _) = inner_min(&json!(50), &json!(255)).expect("failed");
        assert_eq!(*r.unwrap().pointer("/partial").unwrap(), json!(50.0));

        let (r, _) = inner_min(&json!(200), &json!(50)).expect("failed");
        assert_eq!(*r.unwrap().pointer("/partial").unwrap(), json!(50.0));
    }

    #[test]
    fn null_outputs_result() {
        let (r, _) = inner_min(&json!(null), &json!(42)).expect("failed");
        assert_eq!(*r.unwrap().pointer("/result").unwrap(), json!(42));
    }
}