fclipperr 0.1.0

copy anything to clipboard with rust
use std::io::{self, Write};

pub enum CopyStrategy {
    Local,
    Remote,
}

pub fn detect_environment() -> CopyStrategy {
    if std::env::var("SSH_TTY").is_ok() 
        || std::env::var("SSH_CONNECTION").is_ok()
        || std::env::var("SSH_CLIENT").is_ok() {
        CopyStrategy::Remote
    } else {
        CopyStrategy::Local
    }
}

pub fn copy_to_clipboard_local(content: &str) -> Result<(), String> {
    #[cfg(not(target_os = "unknown"))]
    {
        use arboard::Clipboard;
        
        let mut clipboard = Clipboard::new()
            .map_err(|e| format!("Failed to access clipboard: {}", e))?;
        
        clipboard.set_text(content)
            .map_err(|e| format!("Failed to copy to clipboard: {}", e))?;
        
        Ok(())
    }
    
    #[cfg(target_os = "unknown")]
    Err("Local clipboard not supported on this platform".to_string())
}

pub fn copy_to_clipboard_remote(content: &str) -> Result<(), String> {
    let encoded = base64::Engine::encode(&base64::engine::general_purpose::STANDARD, content.as_bytes());
    
    let osc52_sequence = format!("\x1b]52;c;{}\x07", encoded);
    
    io::stdout()
        .write_all(osc52_sequence.as_bytes())
        .map_err(|e| format!("Failed to write OSC 52 sequence: {}", e))?;
    
    io::stdout()
        .flush()
        .map_err(|e| format!("Failed to flush stdout: {}", e))?;
    
    Ok(())
}

pub fn copy_content(content: &str, strategy: CopyStrategy) -> Result<(), String> {
    match strategy {
        CopyStrategy::Local => copy_to_clipboard_local(content),
        CopyStrategy::Remote => copy_to_clipboard_remote(content),
    }
}