openaddresses_plugin/
lib.rs

1mod 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);