aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gleam/os.gleam45
-rw-r--r--test/gleam/os_test.gleam15
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))
+}