Variables de Entorno (std::env)
En esta página
std::env sigue el modelo 12-factor: la configuración proviene del entorno.
El módulo ofrece lectura y escritura de variables individuales, enumeración de
todo el entorno, y funciones de plataforma como env.os() y env.arch(). Como
interactúa con el proceso del host, no se puede ejecutar en el sandbox WASM;
usa la CLI de Zolo.
Leer, definir y eliminar variables
env.get(name) devuelve la cadena del valor o nil cuando la variable no
existe. El operador ?? es el idioma natural para los valores por defecto.
env.set y env.remove modifican el entorno del proceso actual:
Lee PATH, aplica un valor por defecto con ??, define APP_NAME y luego lo elimina.
// Feature: env.get / env.set — environment variables
// When to use: env-driven config (12-factor), feature flags, secrets.
use std::env
// env.get(name) -> string or nil if not present.
let path = env.get("PATH")
print(path != nil) // expected: true
let missing = env.get("VARIABLE_THAT_DOES_NOT_EXIST_42")
print(missing) // expected: nil
// Idiomatic pattern: default via `??`.
let port = env.get("APP_PORT") ?? "8080"
print(port) // expected: 8080 (if APP_PORT not set)
// env.set(name, value) modifies the current process environment.
env.set("APP_NAME", "zolo")
print(env.get("APP_NAME")) // expected: zolo
// env.remove undoes it.
env.remove("APP_NAME")
print(env.get("APP_NAME")) // expected: nil
Requiere la CLI o el host de Zolo; ábrelo en el playground o ejecútalo localmente.
Enumerar el entorno y consultar el sistema
env.all() devuelve un mapa con todas las variables. env.os(), env.arch()
y env.home_dir() exponen información del sistema operativo útil en scripts
multiplataforma:
Lee PATH de env.all(), imprime el SO, la arquitectura y el directorio home.
// Feature: env.all / env.os / env.arch / env.home_dir — environment info
// When to use: cross-platform scripts, debugging, picking paths per OS.
use std::Map
use std::env
// env.all() -> plain table mapping VAR=value. Use Map.from to wrap
// it in a Map object, or index it directly with `[name]`.
let all = env.all()
let path = all["PATH"]
let has_path = path != nil
print(has_path) // expected: true
// Current OS: "windows", "linux", "macos".
// (`os` shadows the Lua-builtin module of the same name; pick a
// different identifier to be safe.)
let cur_os = env.os()
print(cur_os.len() > 0) // expected: true
// Architecture: "x64", "arm64", etc.
let cur_arch = env.arch()
print(cur_arch.len() > 0) // expected: true
// User's home directory (nil only on very unusual setups).
let home = env.home_dir()
let has_home = home != nil
print(has_home) // expected: true
Requiere la CLI o el host de Zolo; ábrelo en el playground o ejecútalo localmente.
Patrón: struct de configuración
El patrón recomendado para aplicaciones 12-factor es centralizar todos los
valores por defecto en una struct Config y cargarla una vez al inicio, con
funciones auxiliares para convertir cadenas en enteros y booleanos:
Define Config con port, log_level, debug y database_url mediante variables de entorno.
// Feature: env — idiomatic pattern for loading configuration
// When to use: 12-factor applications read config from env vars.
use std::string
use std::env
// Define a config struct to centralize all defaults.
struct Config {
port: int,
log_level: str,
debug: bool,
database_url: str,
}
fn parse_int(s: str?, default_v: int) -> int {
if s == nil { return default_v }
let n = string::to_int(s)
if n == nil { return default_v }
return n
}
fn parse_bool(s: str?) -> bool {
if s == nil { return false }
return s == "true" || s == "1" || s == "yes"
}
fn load_config() -> Config {
return Config { port: parse_int(env.get("APP_PORT"), 8080), log_level: env.get("APP_LOG_LEVEL") ?? "info", debug: parse_bool(env.get("APP_DEBUG")), database_url: env.get("DATABASE_URL") ?? "postgres://localhost/dev" }
}
let cfg = load_config()
print(cfg.port) // expected: 8080 (default)
print(cfg.log_level) // expected: info (default)
Requiere la CLI o el host de Zolo; ábrelo en el playground o ejecútalo localmente.
Desafío
Define APP_PORT=3000 antes de ejecutar y verifica que cfg.port cambia de
8080 a 3000.