allan2 / dotenvy

A well-maintained fork of the dotenv crate
MIT License
688 stars 43 forks source link

Add support for multiline JSON values #104

Closed amab8901 closed 1 month ago

amab8901 commented 4 months ago

The following doesn't work, but would be great if it did:

.env:

KEY1=hello
JSON_VAL_ONELINE='[{"unit": 1,"eid": 1,"label": "Label1","uid": "00000000-0000-0000-0000-000000000001","path": "/tmp/path/1",},"unit": 2,"eid": 2,"label": "Label2","uid": "00000000-0000-0000-0000-000000000002","path": "/tmp/path/2",},"unit": 3,"eid": 3,"label": "Label3","uid": "00000000-0000-0000-0000-000000000003","path": "/tmp/path/3"}]'
JSON_VAL_MULTILINE='[{
    "unit": 1,
    "eid": 1,
    "label": "Label1",
    "uid": "00000000-0000-0000-0000-000000000001",
    "path": "/tmp/path/1"
    },
    "unit": 2,
    "eid": 2,
    "label": "Label2",
    "uid": "00000000-0000-0000-0000-000000000002",
    "path": "/tmp/path/2"
    },
    "unit": 3,
    "eid": 3,
    "label": "Label3",
    "uid": "00000000-0000-0000-0000-000000000003",
    "path": "/tmp/path/3"
    }
]'
KEY2=world

main.rs:

use std::env;

fn main() {
    dotenv::dotenv().ok();
    let env1 = env::var("KEY1").unwrap();
    dbg!(&env1);
    let env2 = env::var("JSON_VAL_ONELINE").unwrap();
    dbg!(&env2);
    let env3 = env::var("JSON_VAL_MULTILINE").unwrap();
    dbg!(&env3);
    let env4 = env::var("KEY2").unwrap();
    dbg!(&env4);
}

Terminal output:

$ cargo r
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s
     Running `target/debug/nice`
[src/main.rs:6:5] &env1 = "hello"
[src/main.rs:8:5] &env2 = "[{\"unit\": 1,\"eid\": 1,\"label\": \"Label1\",\"uid\": \"00000000-0000-0000-0000-000000000001\",\"path\": \"/tmp/path/1\",},\"unit\": 2,\"eid\": 2,\"label\": \"Label2\",\"uid\": \"00000000-0000-0000-0000-000000000002\",\"path\": \"/tmp/path/2\",},\"unit\": 3,\"eid\": 3,\"label\": \"Label3\",\"uid\": \"00000000-0000-0000-0000-000000000003\",\"path\": \"/tmp/path/3\"}]"
thread 'main' panicked at src/main.rs:9:47:
called `Result::unwrap()` on an `Err` value: NotPresent
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
fmorency commented 1 month ago

The JSON in your JSON_VAL_MULTILINE variable is invalid. It is missing some {.

roele commented 1 month ago

Seems to work if you ask me...

TEST_SINGLE='{"bla":"one\ntwo"}'
TEST_MULTI='{
  "bla":"onetwo",
  "foo":"bar"
}'
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let p = Path::new(".env");

    for item in dotenvy::from_path_iter(&p)? {
        let (k, v) = item.unwrap();
        println!("{}: {}", k, v);
    }

    Ok(())
}