Easy build a configs from environment variables and use it in globally.
examples | ||
itconfig | ||
itconfig-tests | ||
.gitignore | ||
.travis.yml | ||
Cargo.toml | ||
LICENSE | ||
README.md |
itconfig
Easy build a configs from environment variables and use it in globally.
We recommend you start with the documentation.
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
#[macro_use] extern crate itconfig;
use std::env;
//use dotenv::dotenv;
config! {
DEBUG: bool => false,
#[env_name = "APP_HOST"]
HOST: String => "127.0.0.1",
DATABASE_URL < (
"postgres://",
POSTGRES_USERNAME => "user",
":",
POSTGRES_PASSWORD => "pass",
"@",
POSTGRES_HOST => "localhost:5432",
"/",
POSTGRES_DB => "test",
),
APP {
static BASE_URL => "/api", // &'static str by default
ARTICLE {
static PER_PAGE: u32 => 15,
}
#[cfg(feature = "companies")]
COMPANY {
#[env_name = "INSTITUTIONS_PER_PAGE"]
static 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
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);
}
Running tests
cargo test
Roadmap
- Add namespace for variables
- Custom env name
- Support feature config and other meta directives
- Add default value to env if env is not found
- Concat env variables to one variable
- Add nested namespaces
- Support meta for namespaces
- Support array type
- Support hashmap type
- Support custom env type
- Common configuration for namespace variables
Available features
- default - ["macro", "primitives"]
- macro - Activates
config!
macros for easy configure web application. - static - Add
static
option toconfig!
macros (uses optionallazy_static
package). - array - Add EnvString impl for vector type (uses optional
serde_json
package). - primitives - Group for features:
numbers
andbool
. - numbers - Group for features:
int
,uint
andfloat
. - int - Group for features:
i8
,i16
,i32
,i64
,i128
andisize
. - uint - Group for features:
u8
,u16
,u32
,u64
,u128
andusize
. - float - Group for features:
f32
andf64
- i8 - impl EnvString for i8 type
- i16 - impl EnvString for i16 type
- i32 - impl EnvString for i32 type
- i64 - impl EnvString for i64 type
- i128 - impl EnvString for i128 type
- isize - impl EnvString for isize type
- u8 - impl EnvString for u8 type
- u16 - impl EnvString for u16 type
- u32 - impl EnvString for u32 type
- u64 - impl EnvString for u64 type
- u128 - impl EnvString for u128 type
- usize - impl EnvString for usize type
- f32 - impl EnvString for f32 type
- f64 - impl EnvString for f64 type
- bool - impl EnvString for bool type
License
Contributors
pleshevskiy (Dmitriy Pleshevskiy) – creator, maintainer.