// Felles hjelpefunksjoner for å spawne CLI-verktøy fra jobbkø-handlere. // // Mønsteret: maskinrommet orkestrerer (payload-parsing, sikkerhetskontroller), // CLI-verktøyet gjør jobben (API-kall, DB-skriving, prosessering). // Stdout → jobbresultat (JSON), stderr → feillogg, exitkode → status. // // Ref: docs/retninger/unix_filosofi.md use std::process::Stdio; /// Kjør et CLI-verktøy og returner stdout som JSON. /// /// - `bin_name`: Verktøynavn for logging (f.eks. "synops-tts") /// - `cmd`: Ferdig konfigurert Command med args og env /// /// Stderr logges. Non-zero exit code gir Err med stderr-innhold. pub async fn run_cli_tool( bin_name: &str, cmd: &mut tokio::process::Command, ) -> Result { cmd.stdout(Stdio::piped()).stderr(Stdio::piped()); let child = cmd .spawn() .map_err(|e| format!("Kunne ikke starte {bin_name}: {e}"))?; let output = child .wait_with_output() .await .map_err(|e| format!("Feil ved kjøring av {bin_name}: {e}"))?; let stderr = String::from_utf8_lossy(&output.stderr); if !stderr.is_empty() { tracing::info!(stderr = %stderr, "{bin_name} stderr"); } if !output.status.success() { let code = output.status.code().unwrap_or(-1); return Err(format!( "{bin_name} feilet (exit {code}): {stderr}" )); } let stdout = String::from_utf8_lossy(&output.stdout); serde_json::from_str(&stdout) .map_err(|e| format!("Kunne ikke parse {bin_name} output: {e}")) } /// Videresend en miljøvariabel til en Command hvis den er satt. pub fn forward_env(cmd: &mut tokio::process::Command, key: &str) { if let Ok(v) = std::env::var(key) { cmd.env(key, v); } } /// Sett DATABASE_URL på en Command. Feiler hvis variabelen mangler. pub fn set_database_url(cmd: &mut tokio::process::Command) -> Result<(), String> { let db_url = std::env::var("DATABASE_URL") .map_err(|_| "DATABASE_URL ikke satt".to_string())?; cmd.env("DATABASE_URL", &db_url); Ok(()) }