datagen_rs/schema/
file.rs1use 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}