openaddresses_plugin/
lib.rs1mod backends;
2mod objects;
3
4use crate::backends::backend::{Backend, BackendConstructor};
5use crate::backends::memory_backend::MemoryBackend;
6#[cfg(feature = "sqlite")]
7use crate::backends::sqlite_backend::SQLiteBackend;
8use crate::objects::args::{BackendType, IntoGenerated, PluginArgs, StringOrVec};
9use crate::objects::call_args::CallArgs;
10use datagen_rs::declare_plugin;
11use datagen_rs::generate::current_schema::CurrentSchemaRef;
12use datagen_rs::generate::generated_schema::GeneratedSchema;
13use datagen_rs::plugins::plugin::{Plugin, PluginConstructor};
14use datagen_rs::util::types::Result;
15#[cfg(feature = "log")]
16use log::LevelFilter;
17#[cfg(feature = "log")]
18use log4rs::append::console::ConsoleAppender;
19#[cfg(feature = "log")]
20use log4rs::config::{Appender, Root};
21#[cfg(feature = "log")]
22use log4rs::Config;
23use serde_json::Value;
24use std::fmt::Debug;
25use std::sync::{Arc, Mutex};
26
27#[derive(Debug)]
28struct OpenAddressesPlugin {
29 backend: Mutex<Box<dyn Backend>>,
30}
31
32impl Plugin for OpenAddressesPlugin {
33 fn name(&self) -> String {
34 "openaddresses".into()
35 }
36
37 fn generate(&self, schema: CurrentSchemaRef, args: Value) -> Result<Arc<GeneratedSchema>> {
38 let args: CallArgs = serde_json::from_value(args)?;
39 let feature = self.backend.lock().unwrap().get_random_feature()?;
40
41 args.into_generated(&schema, &feature)
42 }
43}
44
45impl PluginConstructor for OpenAddressesPlugin {
46 fn new(args: Value) -> Result<Self> {
47 let args: PluginArgs = serde_json::from_value(args)?;
48 let paths = match args.files.clone() {
49 StringOrVec::Single(path) => vec![path],
50 StringOrVec::Multiple(paths) => paths,
51 };
52 #[cfg(feature = "log")]
53 log4rs::init_config(
54 Config::builder()
55 .appender(
56 Appender::builder()
57 .build("stdout", Box::new(ConsoleAppender::builder().build())),
58 )
59 .build(Root::builder().appender("stdout").build(LevelFilter::Debug))?,
60 )?;
61
62 #[cfg(feature = "log")]
63 log::debug!("Initializing plugin 'openaddress'");
64
65 let backend: Box<dyn Backend> = match &args.backend.clone().unwrap_or_default() {
66 #[cfg(feature = "sqlite")]
67 BackendType::SQLite { .. } => Box::new(SQLiteBackend::new(paths, args)?),
68 #[cfg(not(feature = "sqlite"))]
69 BackendType::SQLite { .. } => {
70 return Err("The SQLite backend is not enabled in this build".into())
71 }
72 BackendType::Memory => Box::new(MemoryBackend::new(paths, args)?),
73 };
74
75 Ok(Self {
76 backend: Mutex::new(backend),
77 })
78 }
79}
80
81declare_plugin!(OpenAddressesPlugin);