datagen_rs/schema/
file.rs

1use crate::schema::transform::Transform;
2#[cfg(feature = "schema")]
3use schemars::JsonSchema;
4#[cfg(feature = "serialize")]
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone)]
8#[cfg_attr(feature = "schema", derive(JsonSchema))]
9#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
10#[cfg_attr(feature = "serialize", serde(rename_all = "camelCase"))]
11pub struct File {
12    pub path: String,
13    pub mode: Option<FileMode>,
14    pub transform: Option<Vec<Transform>>,
15}
16
17#[derive(Debug, Clone, Default)]
18#[cfg_attr(feature = "schema", derive(JsonSchema))]
19#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
20#[cfg_attr(feature = "serialize", serde(rename_all = "camelCase"))]
21pub enum FileMode {
22    #[default]
23    Sequential,
24    Random,
25}
26
27#[cfg(feature = "generate")]
28pub mod generate {
29    use crate::generate::current_schema::CurrentSchemaRef;
30    use crate::generate::generated_schema::generate::IntoGenerated;
31    use crate::generate::generated_schema::GeneratedSchema;
32    use crate::schema::file::{File, FileMode};
33    use crate::schema::transform::Transform;
34    use crate::util::sequential_vec::SequentialVec;
35    use crate::util::types::Result;
36    use once_cell::sync::Lazy;
37    use serde_json::Value;
38    use std::collections::HashMap;
39    use std::io::BufReader;
40    use std::sync::Mutex;
41
42    static FILES: Lazy<Mutex<HashMap<String, SequentialVec<Value>>>> =
43        Lazy::new(|| Mutex::new(HashMap::new()));
44
45    impl IntoGenerated for File {
46        fn into_generated(self, _: CurrentSchemaRef) -> Result<GeneratedSchema> {
47            let mut lock = FILES.lock().unwrap();
48            let data = match lock.get_mut(&self.path) {
49                Some(val) => val,
50                None => {
51                    let reader = BufReader::new(std::fs::File::open(&self.path)?);
52                    let data = SequentialVec::<Value>::new(serde_json::from_reader(reader)?)?;
53                    lock.insert(self.path.clone(), data);
54                    lock.get_mut(&self.path).unwrap()
55                }
56            };
57
58            let value = match self.mode.unwrap_or_default() {
59                FileMode::Sequential => data.next_value().clone(),
60                FileMode::Random => data.random().clone(),
61            };
62
63            Ok(GeneratedSchema::Value(value))
64        }
65
66        fn get_transform(&self) -> Option<Vec<Transform>> {
67            self.transform.clone()
68        }
69    }
70}