-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathEnv.re
73 lines (58 loc) · 1.81 KB
/
Env.re
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
let windows = Sys.os_type == "Win32";
let caseInsensitiveEqual = (i, j) =>
String.lowercase_ascii(i) == String.lowercase_ascii(j);
let caseInsensitiveHash = k => Hashtbl.hash(String.lowercase_ascii(k));
module EnvHash = {
type t = string;
let equal = if (windows) {caseInsensitiveEqual} else {(==)};
let hash = if (windows) {caseInsensitiveHash} else {Hashtbl.hash};
};
module EnvHashtbl = Hashtbl.Make(EnvHash);
type t = EnvHashtbl.t(string);
let list_of_in_channel = ic => {
Util.readUntilEndOfFile(ic)
|> List.filter(s => String.contains(s, '='))
|> List.map(String.split_on_char('='))
|> List.map(Util.escapeEquals);
};
let make = envFiles => {
let fileEnv =
envFiles
|> List.map(open_in_bin)
|> List.map(list_of_in_channel)
|> List.concat
|> Array.of_list
|> Array.map(((key, value)) => key ++ "=" ++ value);
let curEnv = Unix.environment() |> Array.append(fileEnv);
let table = EnvHashtbl.create(Array.length(curEnv));
let f = item =>
try({
let idx = String.index(item, '=');
let name = String.sub(item, 0, idx);
let value = String.sub(item, idx + 1, String.length(item) - idx - 1);
let nextValue =
EnvHashtbl.find_opt(table, name)
|> (
fun
| Some(prevValue) => String.concat(":", [prevValue, value])
| None => value
);
EnvHashtbl.replace(table, name, nextValue);
}) {
| Not_found => ()
};
Array.iter(f, curEnv);
table;
};
let to_array = env => {
let f = (name, value, items) => [name ++ "=" ++ value, ...items];
let e = Array.of_list(EnvHashtbl.fold(f, env, []));
e;
};
let to_tuple_list = env => {
let f = (name: string, value: string, items) => [(name, value), ...items];
EnvHashtbl.fold(f, env, []);
};
let get_env = (key, env) => {
EnvHashtbl.find(env, key);
};