datagen-rs 0.1.0

A random data generator written in rust
Documentation
use crate::schema::transform::Transform;
#[cfg(feature = "schema")]
use schemars::JsonSchema;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize", serde(rename_all = "camelCase"))]
pub struct File {
    pub path: String,
    pub mode: Option<FileMode>,
    pub transform: Option<Vec<Transform>>,
}

#[derive(Debug, Clone, Default)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize", serde(rename_all = "camelCase"))]
pub enum FileMode {
    #[default]
    Sequential,
    Random,
}

#[cfg(feature = "generate")]
pub mod generate {
    use crate::generate::current_schema::CurrentSchemaRef;
    use crate::generate::generated_schema::generate::IntoGenerated;
    use crate::generate::generated_schema::GeneratedSchema;
    use crate::schema::file::{File, FileMode};
    use crate::schema::transform::Transform;
    use crate::util::sequential_vec::SequentialVec;
    use crate::util::types::Result;
    use once_cell::sync::Lazy;
    use serde_json::Value;
    use std::collections::HashMap;
    use std::io::BufReader;
    use std::sync::Mutex;

    static FILES: Lazy<Mutex<HashMap<String, SequentialVec<Value>>>> =
        Lazy::new(|| Mutex::new(HashMap::new()));

    impl IntoGenerated for File {
        fn into_generated(self, _: CurrentSchemaRef) -> Result<GeneratedSchema> {
            let mut lock = FILES.lock().unwrap();
            let data = match lock.get_mut(&self.path) {
                Some(val) => val,
                None => {
                    let reader = BufReader::new(std::fs::File::open(&self.path)?);
                    let data = SequentialVec::<Value>::new(serde_json::from_reader(reader)?)?;
                    lock.insert(self.path.clone(), data);
                    lock.get_mut(&self.path).unwrap()
                }
            };

            let value = match self.mode.unwrap_or_default() {
                FileMode::Sequential => data.next_value().clone(),
                FileMode::Random => data.random().clone(),
            };

            Ok(GeneratedSchema::Value(value))
        }

        fn get_transform(&self) -> Option<Vec<Transform>> {
            self.transform.clone()
        }
    }
}