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}