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}