mod error;
mod options;
mod platform;
pub use error::Error;
#[derive(Debug, Clone, Default)]
pub struct ClipboardOptions {
pub linux: LinuxOptions,
}
#[derive(Debug, Clone)]
pub struct LinuxOptions {
pub selection: LinuxSelection,
pub backend: LinuxBackend,
}
impl Default for LinuxOptions {
fn default() -> Self {
Self {
selection: LinuxSelection::Clipboard,
backend: LinuxBackend::Auto,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum LinuxSelection {
#[default]
Clipboard,
Primary,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum LinuxBackend {
#[default]
Auto,
Wayland,
X11,
}
pub struct Clipboard {
inner: platform::ClipboardImpl,
}
impl Clipboard {
pub fn new() -> Result<Self, Error> {
Self::new_with_options(ClipboardOptions::default())
}
pub fn new_with_options(opts: ClipboardOptions) -> Result<Self, Error> {
Ok(Self {
inner: platform::ClipboardImpl::new(&opts)?,
})
}
pub async fn get_text(&mut self) -> Result<String, Error> {
self.inner.get_text().await
}
pub async fn set_text(&mut self, text: &str) -> Result<(), Error> {
self.inner.set_text(text).await
}
}
#[cfg(not(target_arch = "wasm32"))]
pub mod blocking {
use super::*;
pub fn get_text() -> Result<String, Error> {
let rt = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.map_err(|e| Error::Platform {
context: "blocking: failed to create runtime",
source: Box::new(e),
})?;
let mut clipboard = Clipboard::new()?;
rt.block_on(clipboard.get_text())
}
pub fn set_text(text: &str) -> Result<(), Error> {
let rt = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.map_err(|e| Error::Platform {
context: "blocking: failed to create runtime",
source: Box::new(e),
})?;
let mut clipboard = Clipboard::new()?;
rt.block_on(clipboard.set_text(text))
}
}