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
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//! # itconfig
//!
//! Simple configuration with macro for rust application.
//!
//!
//! ## Motivation
//!
//! I began to use rust with web programming experience where environment variables are widely used
//! and often there are more then 50 of them. First I looked at already created libraries.
//! But there it's necessary to initialise structure that needs to be moved to each function
//! where you need variable. It uses little bit memory, but configuration lifetime is as long
//! as application lifetime. Because of it I decided to create my own library.
//!
//!
//! ## Example usage
//!
//! ```rust
//! #[macro_use] extern crate itconfig;
//! use std::env;
//! // use dotenv::dotenv;
//!
//! config! {
//!     DEBUG: bool => true,
//!     HOST: String => "127.0.0.1",
//!
//!     DATABASE_URL < (
//!         "postgres://",
//!         POSTGRES_USERNAME => "user",
//!         ":",
//!         POSTGRES_PASSWORD => "pass",
//!         "@",
//!         POSTGRES_HOST => "localhost:5432",
//!         "/",
//!         POSTGRES_DB => "test",
//!     ),
//!
//!     APP {
//!         ARTICLE {
//!             PER_PAGE: u32 => 15,
//!         }
//!
//!         #[cfg(feature = "companies")]
//!         COMPANY {
//!             #[env_name = "INSTITUTIONS_PER_PAGE"]
//!             PER_PAGE: u32 => 15,
//!         }
//!     }
//!
//!     FEATURE {
//!         NEW_MENU: bool => false,
//!
//!         COMPANY {
//!             PROFILE: bool => false,
//!         }
//!     }
//! }
//!
//! fn main () {
//!     // dotenv().ok();
//!     env::set_var("FEATURE_NEW_MENU", "t");
//!
//!     cfg::init();
//!     assert_eq!(cfg::HOST(), String::from("127.0.0.1"));
//!     assert_eq!(cfg::DATABASE_URL(), String::from("postgres://user:pass@localhost:5432/test"));
//!     assert_eq!(cfg::APP::ARTICLE::PER_PAGE(), 15);
//!     assert_eq!(cfg::FEATURE::NEW_MENU(), true);
//! }
//! ```
//!
//! Macro is an optional feature, enabled by default. You can install itconfig without default
//! features and use this lib as shown below
//!
//! ```rust
//! use itconfig::*;
//! use std::env;
//! // use dotenv::dotenv;
//!
//! fn main() {
//!     env::set_var("DATABASE_URL", "postgres://127.0.0.1:5432/test");
//!
//!     let database_url = get_env::<String>("DATABASE_URL").unwrap();
//!     let new_profile: bool = get_env_or_default("FEATURE_NEW_PROFILE", false);
//!     let articles_per_page: u32 = get_env_or_set_default("ARTICLES_PER_PAGE", 10);
//! }
//! ```
//!


// Rustc lints.
#![deny(unused_imports)]

/////////////////////////////////////////////////////////////////////////////

#[macro_use]
extern crate failure;

mod enverr;
mod getenv;
pub mod envstr;

pub use self::getenv::*;
pub use self::enverr::*;

pub mod prelude {
    pub use crate::envstr::*;
    pub use crate::enverr::*;
}


#[cfg(feature = "macro")]
#[allow(unused_imports)]
#[macro_use]
mod r#macro;
#[cfg(feature = "macro")]
#[doc(hidden)]
pub use r#macro::*;