path y env: Rutas y configuración del entorno
Lee la ruta y las variables de entorno en el búfer de la persona que llama e identifica errores de capacidad.
Wave Foundation
combinación de caminos
std::path::copy
path_join2(dst: ptr<u8>, dst_cap: i32, left: str, right: str) -> i32
path_basename_copy(dst: ptr<u8>, dst_cap: i32, path: str) -> i32
path_dirname_copy(dst: ptr<u8>, dst_cap: i32, path: str) -> i32
La capacidad incluye el último espacio NUL. Un resultado exitoso es cualquier longitud excluyendo NUL, el fracaso es -1. Solo en caso de éxito usaremos el destino como una cadena. Estas funciones operan en cadenas de ruta y no verifican la existencia de archivos ni los permisos de acceso. La combinación de rutas por sí sola no evita los escapes de directorios ni verifica la identidad de los archivos reales.
variable de entorno
std::env::environ
env_get(name: str, dst: ptr<u8>, dst_cap: i64) -> i64
env_exists(name: str) -> bool
env_get_i64(name: str) -> EnvResult<i64>
env_get_i32(name: str) -> EnvResult<i32>
env_get devuelve la longitud excluyendo NUL en caso de éxito. El búfer de llamadas debe poder contener hasta NUL. Un valor vacío se diferencia de un error sin clave porque puede tener éxito con una longitud de 0.
Obtenga y distinga errores de std::env::consts a NOT_FOUND, NO_SPACE, INVALID_KEY, READ, SOURCE_INCOMPLETE, NO_MEMORY. No trate la falta de búfer como si faltara una clave. Para buscar números, marque ok en el resultado y luego use value. No trate automáticamente el contenido de las variables de entorno como configuraciones confiables; comprobar su alcance y tipo.
El siguiente ejemplo combina los directorios data y los nombres de archivos input.txt.
import("std::path::copy")::{
path_join2
};
fun main() -> i32 {
var output: array<u8, 64>;
var length: i32 = path_join2(&output[0], 64, "data", "input.txt");
if (length < 0) {
return 1;
}
println("{}", &output[0] as str);
return 0;
}
Resultado de la ejecución:
data/input.txt
Dividir directorios y nombres de archivos
El siguiente ejemplo copia una ruta dividida en dos búferes. No es necesario que el archivo original exista realmente.
import("std::path::copy")::{
path_basename_copy,
path_dirname_copy
};
fun main() -> i32 {
var directory: array<u8, 64>;
var filename: array<u8, 64>;
var directory_length: i32 = path_dirname_copy(&directory[0], 64, "data/report.txt");
var filename_length: i32 = path_basename_copy(&filename[0], 64, "data/report.txt");
if (directory_length < 0 || filename_length < 0) {
return 1;
}
println("directory={}", &directory[0] as str);
println("filename={}", &filename[0] as str);
return 0;
}
Resultado de la ejecución:
directory=data
filename=report.txt
Ambas reservas permanecerán vigentes hasta el final de main. as str lee el mismo búfer que una cadena sin asignar una nueva cadena. Por lo tanto, si modifica el búfer, la cadena leída en esa dirección también cambiará.
Establecer preferencias predeterminadas
Las variables de entorno son configuraciones pasadas fuera del programa. Al leer una configuración numérica, marque "¿Se puede leer como un número entero?" y "¿Está dentro del rango permitido por este programa?"
import("std::env::environ")::{
EnvResult,
env_get_i32
};
fun main() -> i32 {
var setting: EnvResult<i32> = env_get_i32("WAVE_EXAMPLE_WORKERS");
var workers: i32 = 4;
if (setting.ok) {
if (setting.value < 1 || setting.value > 32) {
println("workers must be between 1 and 32");
return 1;
}
workers = setting.value;
}
println("workers={}", workers);
return 0;
}
Si WAVE_EXAMPLE_WORKERS no está presente o no se puede leer como un número entero, se utiliza el valor predeterminado de 4. Si se establece un número entero entre 1 y 32, se utiliza ese valor, y si es un número entero fuera del rango, termina con un error.
Linux/macOS:
WAVE_EXAMPLE_WORKERS=8 wavec run main.wave
PowerShell:
$env:WAVE_EXAMPLE_WORKERS = "8"
wavec run main.wave
En ambos casos, se genera workers=8. El ejemplo anterior selecciona una política predeterminada simple. Si esta es una configuración obligatoria, trate los errores de búsqueda numérica como errores en lugar de reemplazarlos con valores predeterminados. Si necesita distinguir entre clave faltante, búfer insuficiente y error de lectura, utilice las constantes env_get y ENV_ERR_*.