fluent_data 1.2.4

A low footprint streaming data modelization library and service.
Documentation
use std::error::Error;

use approx_eq::assert_approx_eq;
use rand::SeedableRng;
use rand_distr::{Distribution, Normal};
use regex::Regex;
use serde_json::{json, Value};

const OUT_PATTERN: &str =
    r#"^\[(\{"center":\[[-0-9.]*\],"radius":(null|[0-9.]*),"weight":[0-9.]*\},?)*\]$"#;

pub fn assert_results(result: Vec<String>) {
    let re = Regex::new(OUT_PATTERN).unwrap();
    assert!(result.iter().all(|r| re.is_match(r)));
    assert_final_result(result.last().unwrap());
}

pub fn assert_final_result(m: &String) {
    let final_result: Vec<Value> = serde_json::from_str(m).unwrap();
    let center = final_result[0]["center"].as_array().unwrap()[0]
        .as_f64()
        .unwrap();
    let radius = final_result[0]["radius"].as_f64().unwrap();
    let weight = final_result[0]["weight"].as_f64().unwrap();
    assert_approx_eq!(center, 2.0, 5E-2);
    assert_approx_eq!(radius, 3.0, 5E-2);
    assert_approx_eq!(weight, 10000., 1E-1);
}

pub fn get_point_iter(count: usize) -> impl Iterator<Item = Result<String, Box<dyn Error>>> {
    let normal = Normal::new(2.0, 3.0).unwrap();
    let mut rng = rand::rngs::StdRng::seed_from_u64(9787043385113690);
    (0..count).map(move |_i| {
        let v = normal.sample(&mut rng);
        Ok(json!(vec![v]).to_string())
    })
}