akeyless_mcp 3.0.1

The purpose of this application is to provide access to Akeyless API.
use crate::config::AkeylessMcpConfig;
use crate::error::{AkeylessMcpError, Result};
use std::path::PathBuf;

/// Resolve the API key from (in priority order):
/// 1. Explicit CLI flag value
/// 2. AKEYLESS_MCP_API_KEY environment variable
/// 3. Contents of the configured api_key_file
pub fn resolve_api_key(explicit: Option<&str>, config: &AkeylessMcpConfig) -> Result<String> {
    // 1. Explicit flag
    if let Some(key) = explicit {
        return Ok(key.to_string());
    }

    // 2. Environment variable
    if let Ok(key) = std::env::var("AKEYLESS_MCP_API_KEY") {
        if !key.is_empty() {
            return Ok(key);
        }
    }

    // 3. File
    let path = expand_tilde(&config.api_key_file);
    match std::fs::read_to_string(&path) {
        Ok(content) => {
            let key = content.trim().to_string();
            if key.is_empty() {
                Err(AkeylessMcpError::NoApiKey { path })
            } else {
                Ok(key)
            }
        }
        Err(_) => Err(AkeylessMcpError::NoApiKey { path }),
    }
}

fn expand_tilde(path: &PathBuf) -> PathBuf {
    let s = path.to_string_lossy();
    if let Some(rest) = s.strip_prefix("~/") {
        if let Ok(home) = std::env::var("HOME") {
            return PathBuf::from(home).join(rest);
        }
    }
    path.clone()
}