1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//! # config-source
//!
//! Macro for deriving [config-rs](https://github.com/mehcode/config-rs)'s `config::Source` trait.
//!
//! ## Usage
//!
//! To derive `config::Source` for a struct, simply add the `#[derive(ConfigSource)]` attribute to
//! the struct:
//!
//! ```
//! #[derive(serde::Deserialize, config_source::ConfigSource, Clone, Debug)]
//! pub struct MyConfig {
//!     pub question: String,
//!     pub answer: u64,
//! }
//!
//! impl Default for MyConfig {
//!     fn default() -> Self {
//!         Self {
//!             question: String::from("The Ultimate Question of Life, the Universe, and Everything"),
//!             answer: 42,
//!         }
//!     }
//! }
//! ```
//!
//! Then, you can use the `config::Config` struct to load your configuration using a default value:
//!
//! ```
//! # #[derive(serde::Deserialize, config_source::ConfigSource, Clone, Debug)]
//! # pub struct MyConfig {
//! #     pub question: String,
//! #     pub answer: u64,
//! # }
//! #
//! # impl Default for MyConfig {
//! #     fn default() -> Self {
//! #         Self {
//! #             question: String::from("The Ultimate Question of Life, the Universe, and Everything"),
//! #             answer: 42,
//! #         }
//! #     }
//! # }
//! #
//! let config = config::Config::builder()
//!     .add_source(MyConfig::default()) // Default value as source!
//!     .add_source(config::File::with_name("my_config.toml").required(false))
//!     .add_source(config::Environment::with_prefix("MY_CONFIG").separator("__"))
//!     .build()
//!     .expect("Failed to build `MyConfig`");
//! ```

#![warn(missing_docs)]

mod config;

use proc_macro::TokenStream;

/// Derive `config::Source` for a struct.
#[proc_macro_derive(ConfigSource)]
pub fn config_source(input: TokenStream) -> TokenStream {
    config::config_source(input)
}