Entorno y Configuración

Accediendo a variables de entorno

.NET proporciona acceso a las variables de entorno a través del método System.Environment.GetEnvironmentVariable. Este método recupera el valor de una variable de entorno en tiempo de ejecución.

using System;

const string name = "VARIABLE_EJEMPLO";

var value = Environment.GetEnvironmentVariable(name);
if (string.IsNullOrEmpty(value))
    Console.WriteLine($"Variable '{name}' no esta configurada.");
else
    Console.WriteLine($"Variable '{name}' configurada con '{value}'.");

Rust proporciona la misma funcionalidad de acceso a una variable de entorno en tiempo de ejecución mediante las funciones var y var_os del módulo std::env.

La función var devuelve un Result<String, VarError>, devolviendo la variable si está configurada o devolviendo un error si la variable no está configurada o no es Unicode válido.

var_os tiene una firma diferente, devolviendo una Option<OsString>, devolviendo algún valor si la variable está configurada o devolviendo None si la variable no está configurada. Un OsString no tiene que ser Unicode válido.

use std::env;


fn main() {
    let key = "VariableEjemplo";
    match env::var(key) {
        Ok(val) => println!("{key}: {val:?}"),
        Err(e) => println!("No se pudo interpretar {key}: {e}"),
    }
}
use std::env;

fn main() {
    let key = "VariableEjemplo";
    match env::var_os(key) {
        Some(val) => println!("{key}: {val:?}"),
        None => println!("{key} no definida en el entorno"),
    }
}

Rust también proporciona la funcionalidad de acceder a una variable de entorno en tiempo de compilación. El macro env! del módulo std::env expande el valor de la variable en tiempo de compilación, devolviendo un &'static str. Si la variable no está establecida, se emite un error.

use std::env;

fn main() {
    let example = env!("VariableEjemplo");
    println!("{example}");
}

En .NET, el acceso a variables de entorno en tiempo de compilación se puede lograr, de una manera menos directa, a través de generadores de código fuente.

Configuración

La configuración en .NET es posible mediante proveedores de configuración. El framework proporciona varias implementaciones de proveedores a través del espacio de nombres Microsoft.Extensions.Configuration y paquetes NuGet.

Los proveedores de configuración leen datos de configuración a partir de pares clave-valor utilizando diferentes fuentes y proporcionan una vista unificada de la configuración a través del tipo IConfiguration.

using Microsoft.Extensions.Configuration;

class Example {
    static void Main()
    {
        IConfiguration configuration = new ConfigurationBuilder()
            .AddEnvironmentVariables()
            .Build();

        var example = configuration.GetValue<string>("VariableEjemplo");

        Console.WriteLine(example);
    }
}

Otros ejemplos de proveedores se pueden encontrar en la documentación oficial Proveedores de configuración en .NET.

Una experiencia de configuración similar en Rust está disponible mediante el uso de crates de terceros como figment o config.

Vea el siguiente ejemplo utilizando el crate config:

use config::{Config, Environment};

fn main() {
    let builder = Config::builder().add_source(Environment::default());

    match builder.build() {
        Ok(config) => {
            match config.get_string("variable_ejemplo") {
                Ok(v) => println!("{v}"),
                Err(e) => println!("{e}")
            }
        },
        Err(_) => {
            // algo salio mal
        }
    }
}