mongodb_macro/
opts.rs

1/// Quick and easy creates a new configuration to connect to MongoDB
2/// 
3/// Creating a configuration structure when using one database in a project:
4/// 
5/// ```
6/// use mongodb_macro::Parser;
7/// mongodb_macro::config!(Opts);
8///
9/// fn main() {
10///     std::env::set_var("DB_URL", "mongodb://root:root@localhost:27017");
11///     std::env::set_var("DB_NAME", "test");
12///     std::env::set_var("COLLECTION_NAME", "users");
13/// 
14///     let opts = Opts::parse();
15/// }
16/// ```
17/// 
18/// Creating a configuration structure when using multiple databases in a project:
19/// 
20/// This sets the prefix to the environment variables.
21/// 
22/// ```
23/// use mongodb_macro::Parser;
24/// mongodb_macro::config!(Opts, "MONGO");
25///
26/// fn main() {
27///     std::env::set_var("MONGO_DB_URL", "mongodb://root:root@localhost:27017");
28///     std::env::set_var("MONGO_DB_NAME", "test");
29///     std::env::set_var("MONGO_COLLECTION_NAME", "users");
30/// 
31///     let opts = Opts::parse();
32/// }
33/// ```
34/// 
35/// Creating a configuration structure with explicit fields:
36/// 
37/// ```
38/// use mongodb_macro::Parser;
39/// mongodb_macro::config!(Opts; "MONGO_DB_URL", "MONGO_DB_NAME", "MONGO_COLLECTION_NAME");
40///
41/// fn main() {
42
43///     std::env::set_var("MONGO_DB_URL", "mongodb://root:root@localhost:27017");
44///     std::env::set_var("MONGO_DB_NAME", "test");
45///     std::env::set_var("MONGO_COLLECTION_NAME", "users");
46/// 
47///     let opts = Opts::parse();
48/// }
49/// ```
50#[macro_export]
51macro_rules! config {
52    ($opts:ident, $prefix:tt) => ($crate::config!{$opts, $prefix; ("DB_URL", "DB_NAME", "COLLECTION_NAME")});
53
54    ($opts:ident, $prefix:tt; ($db_url:tt, $db_name:tt, $collection_name:tt)) => {
55
56        #[derive(Clone, Debug, PartialEq, Eq, $crate::Parser)]
57        pub struct $opts {
58
59            /// env by default DB_URL
60            #[clap(env = concat!($prefix, "_", $db_url))]
61            pub db_url: nested_env_parser::Env,
62
63            /// env by default DB_NAME
64            #[clap(env = concat!($prefix, "_", $db_name))]
65            pub db_name: nested_env_parser::Env,
66
67            /// env by default COLLECTION_NAME
68            #[clap(env = concat!($prefix, "_", $collection_name))]
69            pub collection_name: nested_env_parser::Env,
70        }
71    };
72    
73    ($opts:ident) => ($crate::config!{$opts; "DB_URL", "DB_NAME", "COLLECTION_NAME"});
74
75    ($opts:ident; $db_url:tt, $db_name:tt, $collection_name:tt) => {
76        
77        #[derive(Clone, Debug, PartialEq, Eq, $crate::Parser)]
78        pub struct $opts {
79
80            /// env by default DB_URL
81            #[clap(env = $db_url)]
82            pub db_url: $crate::Env,
83
84            /// env by default DB_NAME
85            #[clap(env = $db_name)]
86            pub db_name: $crate::Env,
87
88            /// env by default COLLECTION_NAME
89            #[clap(env = $collection_name)]
90            pub collection_name: $crate::Env,
91        }
92    };
93}