anvil-appimage 1.0.1

Automatically install AppImages with desktop integration
Documentation
use colored::Colorize;
use std::ffi::OsStr;
use std::path::Path;

pub fn check_extension(source: &str, verbose: bool) -> bool {
    let extension = Path::new(source).extension().and_then(|s| s.to_str());
    match extension {
        Some(ext) if ext.to_lowercase() == "appimage" => {
            if verbose {
                println!("{} Valid format ({})", "INFO:".cyan().bold(), ext.yellow());
            }
            true
        }
        _ => {
            println!("{} {}", "ERROR:".red().bold(), "File must be an AppImage");
            false
        }
    }
}

pub fn move_appimage(source: &str, destination: &Path, file_name: &OsStr, verbose: bool) -> bool {
    if verbose {
        println!(
            "{} Moving {} to {}",
            "INFO:".cyan(),
            file_name.to_string_lossy().purple().bold(),
            destination.display().to_string().purple().bold()
        );
    }

    if let Err(_) = std::fs::rename(source, destination) {
        if verbose {
            println!(
                "{} Cross-device move detected, copying instead...",
                "INFO:".yellow()
            );
        }

        if let Err(e) = std::fs::copy(source, destination) {
            eprintln!("{} Could not copy file: {}", "ERROR:".red().bold(), e);
            return false;
        }

        if let Err(e) = std::fs::remove_file(source) {
            if verbose {
                println!(
                    "{} Could not remove source file after copy: {}",
                    "WARN:".yellow(),
                    e
                );
            }
        } else if verbose {
            println!("{} Source file cleaned up", "INFO:".cyan());
        }
    }

    if verbose {
        println!("{} File moved successfully", "INFO:".cyan());
    }
    true
}