#env-var #env-file #dotenv #env #variables #environment

loadenv

A small, zero-dependency dotenv implementation

5 releases

0.1.4 Dec 28, 2020
0.1.3 Aug 21, 2020
0.1.2 Aug 20, 2020
0.1.1 Aug 19, 2020
0.1.0 Aug 19, 2020

#751 in Configuration

34 downloads per month

GPL-3.0-only

20KB
416 lines

loadenv

A simple, zero-dependency 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 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 on the dotenv project page.

File Format

# 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.

fn main() {
    loadenv::load().ok();

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

Load a .env from a string.

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 page for more info.

No runtime deps