diff options
-rw-r--r-- | src/gleam/os.gleam | 45 | ||||
-rw-r--r-- | test/gleam/os_test.gleam | 15 |
2 files changed, 60 insertions, 0 deletions
diff --git a/src/gleam/os.gleam b/src/gleam/os.gleam new file mode 100644 index 0000000..c5a8c5a --- /dev/null +++ b/src/gleam/os.gleam @@ -0,0 +1,45 @@ +//// Function to interact with the host operating system. + +import gleam/list +import gleam/string + +// Internal type for erlang interop. +external type CharList + +external fn os_getenv() -> List(CharList) = + "os" "getenv" + +external fn os_putenv(key: CharList, value: CharList) -> Bool = + "os" "putenv" + +external fn os_unsetenv(key: CharList) -> Bool = + "os" "unsetenv" + +external fn char_list_to_string(CharList) -> String = + "erlang" "list_to_binary" + +external fn string_to_char_list(String) -> CharList = + "erlang" "binary_to_list" + +/// Return all environment variables set on the system. +pub fn get_env() -> List(tuple(String, String)) { + list.map( + os_getenv(), + fn(char_list) { + assert Ok(value) = string.split_once(char_list_to_string(char_list), "=") + value + }, + ) +} + +/// Set an environment variable. +pub fn put_env(key: String, value: String) -> Nil { + let True = os_putenv(string_to_char_list(key), string_to_char_list(value)) + Nil +} + +/// Delete an environment variable. +pub fn delete_env(key: String) -> Nil { + let True = os_unsetenv(string_to_char_list(key)) + Nil +} diff --git a/test/gleam/os_test.gleam b/test/gleam/os_test.gleam new file mode 100644 index 0000000..961e984 --- /dev/null +++ b/test/gleam/os_test.gleam @@ -0,0 +1,15 @@ +import gleam/list +import gleam/os +import gleam/should + +pub fn env_test() { + os.put_env("GLEAM_TEST", "hello") + os.get_env() + |> list.key_find("GLEAM_TEST") + |> should.equal(Ok("hello")) + + os.delete_env("GLEAM_TEST") + os.get_env() + |> list.key_find("GLEAM_TEST") + |> should.equal(Error(Nil)) +} |