Current section
Files
Jump to
Current section
Files
src/envie_ffi.mjs
import { Ok, Error, toList } from "./gleam.mjs";
const getEnv = () => {
if (globalThis.process?.env) return globalThis.process.env;
if (globalThis.Deno?.env) return globalThis.Deno.env.toObject();
return {};
};
export function get_env(name) {
const env = getEnv();
const value = env[name];
if (value === undefined) return new Error(undefined);
return new Ok(String(value));
}
export function set_env(name, value) {
if (globalThis.process?.env) globalThis.process.env[name] = value;
if (globalThis.Deno?.env) globalThis.Deno.env.set(name, value);
return undefined;
}
export function unset_env(name) {
if (globalThis.process?.env) delete globalThis.process.env[name];
if (globalThis.Deno?.env) globalThis.Deno.env.delete(name);
return undefined;
}
export function all_env() {
const env = getEnv();
return toList(Object.entries(env));
}
export function read_file(path) {
// Deno support
if (globalThis.Deno?.readTextFileSync) {
try {
return new Ok(globalThis.Deno.readTextFileSync(path));
} catch {
return new Error(undefined);
}
}
// Node support without static import to avoid breaking Browser
// This trick allows us to use require in many bundlers/Node
// If we're truly in a browser, this will just fail into the catch.
try {
const fs = typeof require !== "undefined" ? require("fs") : null;
if (fs?.readFileSync) {
return new Ok(fs.readFileSync(path, "utf8"));
}
} catch { }
// Impossible to read files synchronously in browser
return new Error(undefined);
}
export function rescue(fn) {
try {
return new Ok(fn());
} catch (e) {
return new Error(e?.message ?? String(e));
}
}