nyaa 0.9.0

A tui tool for browsing and downloading torrents from nyaa.si
Documentation
use std::error::Error;

use serde::{Deserialize, Serialize};

#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum X11Selection {
    Primary,
    Clipboard,
}

#[derive(Clone, Serialize, Deserialize)]
pub struct ClipboardConfig {
    pub cmd: Option<String>,
    pub shell_cmd: Option<String>,
    pub x11_selection: Option<X11Selection>,
}

use cli_clipboard::ClipboardProvider as _;

#[cfg(target_os = "linux")]
use cli_clipboard::{
    linux_clipboard::LinuxClipboardContext,
    x11_clipboard::{Clipboard, Primary, X11ClipboardContext},
};

#[cfg(not(target_os = "linux"))]
use cli_clipboard::ClipboardContext;

use crate::util::cmd::CommandBuilder;

pub fn copy_to_clipboard(
    link: String,
    conf: Option<ClipboardConfig>,
) -> Result<(), Box<dyn Error>> {
    if let Some(conf) = conf.to_owned() {
        if let Some(cmd) = conf.cmd {
            return CommandBuilder::new(cmd)
                .sub("{content}", &link)
                .run(conf.shell_cmd);
        }
    }

    #[cfg(target_os = "linux")]
    {
        match conf.and_then(|sel| sel.x11_selection) {
            Some(X11Selection::Primary) => X11ClipboardContext::<Primary>::new()
                .and_then(|mut s| s.set_contents(link))
                .map_err(|e| format!("Failed to copy to x11 \"primary\":\n{}", e).into()),
            Some(X11Selection::Clipboard) => X11ClipboardContext::<Clipboard>::new()
                .and_then(|mut s| s.set_contents(link))
                .map_err(|e| format!("Failed to copy to x11 \"clipboard\":\n{}", e).into()),
            None => LinuxClipboardContext::new()
                .and_then(|mut s| s.set_contents(link))
                .map_err(|e| format!("Failed to copy to clipboard:\n{}", e).into()),
        }
    }
    #[cfg(not(target_os = "linux"))]
    {
        ClipboardContext::new()
            .and_then(|mut s| s.set_contents(link))
            .map_err(|e| format!("Failed to copy to clipboard:\n{}", e).into())
    }
}