ansible-rs 1.1.0

A Rust wrapper library for Ansible command-line tools (Linux/Unix only)
Documentation
use ansible::{PlatformValidator, get_system_info, validate_system, Result};

fn main() -> Result<()> {
    println!("🔍 Ansible-rs 系统要求检查");
    println!("============================\n");

    // 1. 基本平台检查
    println!("1. 📱 平台兼容性检查");
    println!("--------------------");
    
    match PlatformValidator::check_platform() {
        Ok(()) => {
            println!("✅ 平台支持: {} 是受支持的平台", std::env::consts::OS);
        }
        Err(e) => {
            println!("❌ 平台不支持: {}", e);
            println!("   支持的平台: {:?}", PlatformValidator::supported_platforms());
            return Err(e);
        }
    }
    
    println!("   当前平台: {} ({})", std::env::consts::OS, std::env::consts::ARCH);
    println!("   支持的平台: {:?}", PlatformValidator::supported_platforms());
    println!("   最低 Ansible 版本要求: {}", PlatformValidator::minimum_ansible_version());
    println!();

    // 2. 快速系统验证
    println!("2. ⚡ 快速系统验证");
    println!("------------------");
    
    match validate_system() {
        Ok(()) => {
            println!("✅ 基本系统要求满足");
        }
        Err(e) => {
            println!("❌ 系统要求不满足: {}", e);
            println!("   请确保已安装 Ansible 并且可以在命令行中访问");
        }
    }
    println!();

    // 3. 详细系统信息
    println!("3. 📋 详细系统信息");
    println!("------------------");
    
    match get_system_info() {
        Ok(info) => {
            println!("{}", info);
            
            if info.is_fully_supported() {
                println!("🎉 所有功能都可用!ansible-rs 可以完全正常工作。");
            } else {
                println!("⚠️  部分功能不可用。缺失的功能:");
                for feature in info.missing_features() {
                    println!("   - {}", feature);
                }
                println!("\n💡 建议:");
                println!("   - 确保安装了完整的 Ansible 包");
                println!("   - 检查 PATH 环境变量是否包含 Ansible 命令");
                println!("   - 运行 'ansible --version' 验证安装");
            }
        }
        Err(e) => {
            println!("❌ 无法获取系统信息: {}", e);
            println!("\n🔧 故障排除:");
            println!("   1. 检查是否安装了 Ansible:");
            println!("      - Ubuntu/Debian: sudo apt install ansible");
            println!("      - CentOS/RHEL: sudo yum install ansible");
            println!("      - macOS: brew install ansible");
            println!("      - pip: pip install ansible");
            println!("   2. 验证安装: ansible --version");
            println!("   3. 检查 PATH: echo $PATH");
        }
    }
    println!();

    // 4. 单独检查各个组件
    println!("4. 🔧 组件可用性检查");
    println!("--------------------");
    
    let components: [(&str, fn() -> Result<String>); 5] = [
        ("ansible", PlatformValidator::check_ansible_installation as fn() -> Result<String>),
        ("ansible-playbook", PlatformValidator::check_ansible_playbook as fn() -> Result<String>),
        ("ansible-vault", PlatformValidator::check_ansible_vault as fn() -> Result<String>),
        ("ansible-config", PlatformValidator::check_ansible_config as fn() -> Result<String>),
        ("ansible-inventory", PlatformValidator::check_ansible_inventory as fn() -> Result<String>),
    ];
    
    for (name, check_fn) in components {
        match check_fn() {
            Ok(info) => {
                println!("{}: 可用", name);
                if name == "ansible" {
                    // 显示版本信息
                    let version_line = info.lines().next().unwrap_or("未知版本");
                    println!("   版本: {}", version_line.trim());
                }
            }
            Err(e) => {
                println!("{}: 不可用 - {}", name, e);
            }
        }
    }
    println!();

    // 5. 安装建议
    println!("5. 💡 安装建议");
    println!("-------------");
    println!("如果某些组件不可用,请尝试以下安装方法:");
    println!();
    println!("📦 包管理器安装:");
    println!("   Ubuntu/Debian: sudo apt update && sudo apt install ansible");
    println!("   CentOS/RHEL:   sudo yum install epel-release && sudo yum install ansible");
    println!("   Fedora:        sudo dnf install ansible");
    println!("   macOS:         brew install ansible");
    println!();
    println!("🐍 Python pip 安装:");
    println!("   pip install ansible");
    println!("   pip3 install ansible  # 如果使用 Python 3");
    println!();
    println!("🔗 从源码安装:");
    println!("   git clone https://github.com/ansible/ansible.git");
    println!("   cd ansible");
    println!("   python setup.py install");
    println!();
    println!("📚 更多信息:");
    println!("   官方文档: https://docs.ansible.com/ansible/latest/installation_guide/");
    println!("   中文文档: https://ansible-tran.readthedocs.io/en/latest/");

    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;
    use ansible::*;

    #[test]
    fn test_system_check_example() {
        // Test that the example compiles and the functions exist
        let _platforms = PlatformValidator::supported_platforms();
        let _min_version = PlatformValidator::minimum_ansible_version();
        let _is_supported = PlatformValidator::is_platform_supported();
        
        // These functions exist but may fail in CI without ansible
        let _platform_check = PlatformValidator::check_platform();
        let _validate_result = validate_system();
        let _system_info_result = get_system_info();
    }

    #[test]
    fn test_component_check_functions_exist() {
        // Test that all component check functions exist and have the right signatures
        let _: fn() -> Result<String> = PlatformValidator::check_ansible_installation;
        let _: fn() -> Result<String> = PlatformValidator::check_ansible_playbook;
        let _: fn() -> Result<String> = PlatformValidator::check_ansible_vault;
        let _: fn() -> Result<String> = PlatformValidator::check_ansible_config;
        let _: fn() -> Result<String> = PlatformValidator::check_ansible_inventory;
    }

    #[test]
    fn test_error_handling() {
        // Test error types that might be returned
        let platform_error = AnsibleError::unsupported_platform("test platform");
        assert!(format!("{}", platform_error).contains("Unsupported platform"));

        let command_error = AnsibleError::command_not_found("test command");
        assert!(format!("{}", command_error).contains("Command not found"));

        let system_error = AnsibleError::system_requirement("test requirement");
        assert!(format!("{}", system_error).contains("System requirement not met"));
    }

    #[test]
    fn test_platform_constants() {
        // Test that platform constants are accessible
        let _os = std::env::consts::OS;
        let _arch = std::env::consts::ARCH;
        
        // Test supported platforms list
        let platforms = PlatformValidator::supported_platforms();
        assert!(!platforms.is_empty());
        assert!(platforms.len() >= 5); // At least linux, macos, freebsd, openbsd, netbsd
    }

    #[test]
    fn test_minimum_version_format() {
        let min_version = PlatformValidator::minimum_ansible_version();
        assert_eq!(min_version, "2.9");
        
        // Test that it's a valid version string
        assert!(min_version.chars().any(|c| c.is_ascii_digit()));
        assert!(min_version.contains('.'));
    }
}