# loadenv
A simple, zero-dependency [dotenv](https://github.com/bkeepers/dotenv) implementation for Rust.

# Usage
This library exposes two similar functions. The first is `loadenv::load()`, which looks for a file named `.env` in the current directory and loads its contents into the environment. The second is `loadenv::load_buf()`, which takes a [BufRead](https://doc.rust-lang.org/std/io/trait.BufRead.html) and loads its contents into the environment. This function can be used to load .env files from custom locations or from other data structures like `&[u8]`.

Most of the time, `load()` should be enough for your program.

Variables that are already defined in the environment **will not be replaced** as per [this section](https://github.com/bkeepers/dotenv#why-is-it-not-overriding-existing-env-variables) on the dotenv project page.

# File Format
```conf
# Example .env file
# Comments begin with `#` and must be on their own line
# Pairs are in the form `KEY = value`
USERNAME = ben
PASSWORD = k4+5F_Sa9x%LA&Zy

# `=` is optional for empty values
DEBUG

# whitespace around `=` is optional
FOO=bar
BOP = baz
```

A `.env` file consists of zero or more key-value pairs in the form `KEY = value`. Whitespace before and after the `=` is ignored (including whitespace at the beginning and end of the line).

In addition, the following rules apply to all lines:
- Empty lines are ignored.
- Lines that begin with `#` are comments and are ignored. Note that comments must be on their own line.
- `KEY` may only contain `0-9`, `A-Z` and `_`.
- `value` may be any value.

A more detailed example can be found in `.env` in the root of this project.

# Example
Load the example .env file and print out the new environment.
```rust
fn main() {
    loadenv::load().ok();

    for (k, v) in std::env::vars() {
        println!("{} = '{}'", k, v);
    }
}
```

Load a .env from a string.
```rust
fn main() {
    let dotenv = "FOO=bar\nBOP = baz \n# Comment\n";
    loadenv::load_buf(dotenv.as_bytes()).ok();

    for (k, v) in std::env::vars() {
        println!("{} = '{}'", k, v);
    }
}
```
# Running Tests
Tests must be run in single-threaded mode using `cargo test -- --test-threads=1`. Otherwise, testing will be unreliable because many `std::env` methods are not thread-safe. See [this](https://doc.rust-lang.org/std/env/fn.set_var.html) page for more info.
