worterbuch-common 1.5.0

Client library for Wörterbuch.
Documentation
use hashbrown::HashMap;
use random_word::Lang;
use serde_json::{Value, json};
use std::sync::mpsc;

pub trait KeyValueConsumer {
    type Error;
    fn accept(&mut self, key: Vec<String>, value: Value) -> Result<(), Self::Error>;
}

impl KeyValueConsumer for mpsc::SyncSender<(Vec<String>, Value)> {
    type Error = mpsc::SendError<(Vec<String>, Value)>;
    fn accept(&mut self, key: Vec<String>, values: Value) -> Result<(), Self::Error> {
        self.send((key, values))
    }
}

impl KeyValueConsumer for tokio::sync::mpsc::Sender<(Vec<String>, Value)> {
    type Error = tokio::sync::mpsc::error::SendError<(Vec<String>, Value)>;
    fn accept(&mut self, key: Vec<String>, values: Value) -> Result<(), Self::Error> {
        self.blocking_send((key, values))
    }
}

pub fn generate_dummy_data(
    n_ary_keys: usize,
    key_length: u32,
    values_per_key: usize,
) -> HashMap<Vec<String>, Value> {
    let mut data = HashMap::new();
    let mut n: Vec<usize> = vec![0; key_length as usize];
    let mut prefix = Vec::new();
    'outer: while n[prefix.len()] < n_ary_keys {
        while prefix.len() < key_length as usize {
            let segment = random_word::get(Lang::En);
            prefix.push(segment);
        }

        let path: Vec<String> = prefix.iter().map(ToString::to_string).collect();
        for _ in 0..values_per_key {
            data.insert(path.clone(), json!(random_word::get(Lang::En)));
        }

        prefix.pop();
        n[prefix.len()] += 1;
        while n[prefix.len()] >= n_ary_keys {
            n[prefix.len()] = 0;
            if prefix.pop().is_some() {
                n[prefix.len()] += 1;
            } else {
                break 'outer;
            }
        }
    }

    data
}