Jesús Pérez 09a97ac8f5
chore: update platform submodule to monorepo crates structure
Platform restructured into crates/, added AI service and detector,
       migrated control-center-ui to Leptos 0.8
2026-01-08 21:32:59 +00:00

92 lines
2.7 KiB
Rust

use std::env;
use std::path::PathBuf;
const CONFIG_BASE_PATH: &str = "provisioning/platform/config";
/// Resuelve la ruta del archivo de configuración siguiendo la jerarquía:
/// 1. Variable de entorno {SERVICE}_CONFIG (ruta explícita)
/// 2. Variable de entorno {SERVICE}_MODE + búsqueda de archivo
/// 3. Fallback a defaults
pub fn resolve_config_path(service_name: &str) -> Option<PathBuf> {
// Paso 1: Check {SERVICE}_CONFIG env var (explicit path)
let env_var = format!("{}_CONFIG", service_name.to_uppercase().replace('-', "_"));
if let Ok(path) = env::var(&env_var) {
let config_path = PathBuf::from(path);
if config_path.exists() {
tracing::debug!(
"Using explicit config path from {}: {:?}",
env_var,
config_path
);
return Some(config_path);
}
}
// Paso 2: Check {SERVICE}_MODE env var + find config file
let mode_var = format!("{}_MODE", service_name.to_uppercase().replace('-', "_"));
let mode = env::var(&mode_var).unwrap_or_else(|_| "solo".to_string());
if let Some(path) = find_config_file(service_name, &mode) {
tracing::debug!(
"Using config file for {}.{}: {:?}",
service_name,
mode,
path
);
return Some(path);
}
// Paso 3: Fallback - no config file found
tracing::debug!(
"No config file found for {}.{} - using defaults",
service_name,
mode
);
None
}
/// Busca el archivo de configuración con prioridad:
/// 1. {service}.{mode}.ncl
/// 2. {service}.{mode}.toml
pub fn find_config_file(service_name: &str, mode: &str) -> Option<PathBuf> {
let base = PathBuf::from(CONFIG_BASE_PATH);
// Prioridad 1: .ncl
let ncl_path = base.join(format!("{}.{}.ncl", service_name, mode));
if ncl_path.exists() {
tracing::trace!("Found NCL config: {:?}", ncl_path);
return Some(ncl_path);
}
// Prioridad 2: .toml
let toml_path = base.join(format!("{}.{}.toml", service_name, mode));
if toml_path.exists() {
tracing::trace!("Found TOML config: {:?}", toml_path);
return Some(toml_path);
}
None
}
/// Obtiene la ruta base de configuración (útil para testing)
pub fn config_base_path() -> &'static str {
CONFIG_BASE_PATH
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_config_base_path() {
assert_eq!(config_base_path(), "provisioning/platform/config");
}
#[test]
fn test_find_config_file_priority() {
// This test demonstrates the priority logic without requiring actual files
// In real integration tests, we'd create temporary files
let _ = find_config_file("test-service", "solo");
}
}