mongodb_macro/database.rs
1
2
3/// Creates a new configuration structure to initialize the MongoDB database
4///
5/// Create a new configuration structure to initialize the MongoDB database with a standard environment variable
6///
7/// ```
8/// use mongodb_macro::Parser;
9/// mongodb_macro::database_config!(Opts);
10///
11/// fn main() {
12/// std::env::set_var("MONGODB_HOST", "localhost");
13/// std::env::set_var("DB_URL", "mongodb://root:root@${MONGODB_HOST}:27017");
14/// std::env::set_var("DB_NAME", "test");
15///
16/// let opts = Opts::parse();
17///
18/// assert_eq!(&opts.db_url, "mongodb://root:root@localhost:27017");
19/// }
20/// ```
21///
22/// Create a new configuration structure to initialize the MongoDB database with the specified environment variable
23///
24/// ```
25/// use mongodb_macro::Parser;
26/// mongodb_macro::database_config!(Opts; ("MONGO_DB_URL", "MONGO_DB_NAME"));
27///
28/// fn main() {
29/// std::env::set_var("MONGODB_HOST", "localhost");
30/// std::env::set_var("MONGO_DB_URL", "mongodb://root:root@${MONGODB_HOST}:27017");
31/// std::env::set_var("MONGO_DB_NAME", "test");
32///
33/// let opts = Opts::parse();
34///
35/// assert_eq!(&opts.db_url, "mongodb://root:root@localhost:27017");
36/// }
37/// ```
38#[macro_export]
39macro_rules! database_config {
40 ($opts:ident) => ($crate::database_config!{$opts; ("DB_URL", "DB_NAME")});
41
42 ($opts:ident; ($db_url:tt, $db_name:tt)) => {
43
44 #[derive(Clone, Debug, PartialEq, Eq, $crate::Parser)]
45 pub struct $opts {
46 /// env by default DB_URL
47 #[clap(env = $db_url)]
48 pub db_url: $crate::Env,
49
50 /// env by default DB_NAME
51 #[clap(env = $db_name)]
52 pub db_name: $crate::Env,
53 }
54 };
55}
56
57/// Creates a new factory to create a MongoDB database
58///
59/// Create mongodb database factory with standard environment variable for database url and database name
60///
61/// ```
62/// mongodb_macro::database!(DbFactory; DbFactoryOpts);
63///
64/// fn main() {
65/// std::env::set_var("MONGODB_HOST", "localhost");
66/// std::env::set_var("DB_URL", "mongodb://root:root@${MONGODB_HOST}:27017");
67/// std::env::set_var("DB_NAME", "test");
68///
69/// let factory = DbFactory::parse();
70///
71/// // let db = factory.create().await.expect("failed to connect");
72///
73/// assert_eq!(&factory.config().db_url, "mongodb://root:root@localhost:27017");
74/// }
75/// ```
76///
77/// Create mongodb database factory with specified environment variable for database url and database name
78///
79/// ```
80/// mongodb_macro::database!(DbFactory; DbFactoryOpts; ("MONGO_DB_URL", "MONGO_DB_NAME"));
81///
82/// fn main() {
83/// std::env::set_var("MONGODB_HOST", "localhost");
84/// std::env::set_var("MONGO_DB_URL", "mongodb://root:root@${MONGODB_HOST}:27017");
85/// std::env::set_var("MONGO_DB_NAME", "test");
86///
87/// let factory = DbFactory::parse();
88///
89/// // let db = factory.create().await.expect("failed to connect");
90///
91/// assert_eq!(&factory.config().db_url, "mongodb://root:root@localhost:27017");
92/// }
93/// ```
94#[macro_export]
95macro_rules! database {
96 ($db_factory:ident; $opts:ident) => ($crate::database!{$db_factory; $opts; ("DB_URL", "DB_NAME")});
97
98 ($db_factory:ident; $opts:ident; ($db_url:tt, $db_name:tt)) => {
99
100 $crate::database_config!($opts; ($db_url, $db_name));
101
102 #[derive(Clone, Debug, PartialEq, Eq)]
103 pub struct $db_factory($opts);
104
105 impl $db_factory {
106 fn parse() -> Self {
107 use $crate::Parser;
108
109 let opts = $opts::parse();
110
111 Self(opts)
112 }
113
114 pub fn config(&self) -> &$opts {
115 &self.0
116 }
117
118 pub async fn create(&self) -> Result<::mongodb::Database, ::mongodb::error::Error> {
119 let client = ::mongodb::Client::with_uri_str(&self.0.db_url).await?;
120 Ok(client.database(&self.0.db_name))
121 }
122 }
123 };
124}