kimetsu-core 0.5.1

Shared core types (config, events, ids, paths, memory kinds) for the kimetsu agent runtime + brain.
Documentation
use std::env;
use std::fs;
use std::path::Path;

pub fn resolve_env_value(repo_root: &Path, key: &str) -> Option<String> {
    if let Ok(value) = env::var(key)
        && !value.trim().is_empty()
    {
        return Some(value);
    }

    read_dotenv(repo_root, key)
}

fn read_dotenv(repo_root: &Path, key: &str) -> Option<String> {
    let path = repo_root.join(".env");
    let content = fs::read_to_string(path).ok()?;

    for line in content.lines() {
        let line = line.trim();
        if line.is_empty() || line.starts_with('#') {
            continue;
        }

        let Some((name, value)) = line.split_once('=') else {
            continue;
        };
        if name.trim() != key {
            continue;
        }

        let value = value.trim();
        let value = value
            .strip_prefix('"')
            .and_then(|value| value.strip_suffix('"'))
            .or_else(|| {
                value
                    .strip_prefix('\'')
                    .and_then(|value| value.strip_suffix('\''))
            })
            .unwrap_or(value);
        if !value.is_empty() {
            return Some(value.to_string());
        }
    }

    None
}