import "./core.zc" import "./option.zc" import "./string.zc" import "sys/env.zc" // Cross-platform environment variable handling extern fn _z_setenv(name: const char*, value: const char*, overwrite: int) -> int; extern fn _z_unsetenv(name: const char*) -> int; @derive(Eq) enum EnvRes { ERR, OK, } struct Env {} impl Env { /// Returns the value of an environment variable, or `None`. fn get(name: string) -> Option { let value: string = getenv(name); if (value == NULL) { return Option::None(); } return Option::Some(value); } /// Returns an owned copy of an environment variable value. fn get_dup(name: string) -> Option { let value: string = getenv(name); if (value == NULL) { return Option::None(); } let v = String::from(value); let o = Option::Some(v); v.forget(); return o; } /// Sets an environment variable. fn set(name: string, value: string) -> EnvRes { let ret: int = _z_setenv(name, value, 1); if (ret == 0) { return EnvRes::OK(); } return EnvRes::ERR(); } /// Removes an environment variable. fn unset(name: string) -> EnvRes { let ret: int = _z_unsetenv(name); return (ret == 0) ? EnvRes::OK() : EnvRes::ERR(); } }