Loads environment variables into your structs in one shot.

econf allows to override struct fields with environment variables easily. This is useful to build up applications that optionally overrides some configuration with environment variables. Here is the basic usage:
```rust use econf::LoadEnv;
struct A { x: bool, y: u64, }
fn main() { let a = A { x: true, y: 42, }; println!("Before: {:?}", a);
let a = econf::load(a, "PREFIX");
println!("After: {:?}", a);
} ```
```sh $ ./app Before: A { x: true, y: 42 } After: A { x: true, y: 42 }
$ PREFIX_X=false ./app Before: A { x: true, y: 42 } After: A { x: false, y: 42 } ```
In this example,
PREFIX_X is loaded to xPREFIX_Y is loaded to yThe environment variables are all upper-case with _ separated.
There are some existing crates that provide similar features but econf is unique in the following ways:
Vec, HashMap and various types.boolisize, usize, i8, i16,i32,i64,i128, u8,u16,u32,u64,u128char, Stringf32, f64IpAddr,Ipv4Addr,Ipv6Addr,SocketAddr,SocketAddrV4,SocketAddrV6NonZeroI128,NonZeroI16,NonZeroI32,NonZeroI64,NonZeroI8,NonZeroIsize,NonZeroU128, NonZeroU16,NonZeroU32,NonZeroU64,NonZeroU8, NonZeroUsizePathBufVec, HashSet, HashMap, Option, BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque, tuple
Nested structs are supported.
```rust
struct A { v1: usize, v2: B, }
struct B { v1: usize, v2: usize, }
fn main() { let a = A { v1: 1, v2: B { v1: 2, v2: 3, }, };
let a = econf::load(a, "PREFIX");
} ```
In this example,
PREFIX_V1 is loaded to a.v1PREFIX_V2_V1 is loaded to a.v2.v1PREFIX_V2_V2 is loaded to a.v2.v2Fields in child structs can be specified by chaining the field names with _ as a separator.
However, there're cases that names conflict. For example,
```rust
struct A { v2_v1: usize, v2: B, }
struct B { v1: usize, v2: usize, }
fn main() { let a = A { v2_v1: 1, v2: B { v1: 2, v2: 3, }, };
let a = econf::load(a, "PREFIX");
} ```
Here PREFIX_V2_V1 corresponds to both a.v2_v1 and a.v2.v1. In this case, econf prints warning through log facade and the value is loaded to both a.v2_v1 and a.v2.v1.
Fields that do not implement LoadEnv or simply should not be loaded by econf can be skipped by adding the #[econf(skip)] helper attribute:
```rust
struct A { x: bool, #[econf(skip)] y: u64, // will not be loaded by econf } ```
License: MIT