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)
}