//! Access the clipboard. use crate::command::{self, Command}; use crate::core::clipboard::Kind; use crate::futures::MaybeSend; use std::fmt; /// A clipboard action to be performed by some [`Command`]. /// /// [`Command`]: crate::Command pub enum Action { /// Read the clipboard and produce `T` with the result. Read(Box) -> T>, Kind), /// Write the given contents to the clipboard. Write(String, Kind), } impl Action { /// Maps the output of a clipboard [`Action`] using the provided closure. pub fn map( self, f: impl Fn(T) -> A + 'static + MaybeSend + Sync, ) -> Action where T: 'static, { match self { Self::Read(o, target) => { Action::Read(Box::new(move |s| f(o(s))), target) } Self::Write(content, target) => Action::Write(content, target), } } } impl fmt::Debug for Action { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::Read(_, target) => write!(f, "Action::Read{target:?}"), Self::Write(_, target) => write!(f, "Action::Write({target:?})"), } } } /// Read the current contents of the clipboard. pub fn read( f: impl Fn(Option) -> Message + 'static, ) -> Command { Command::single(command::Action::Clipboard(Action::Read( Box::new(f), Kind::Standard, ))) } /// Read the current contents of the primary clipboard. pub fn read_primary( f: impl Fn(Option) -> Message + 'static, ) -> Command { Command::single(command::Action::Clipboard(Action::Read( Box::new(f), Kind::Primary, ))) } /// Write the given contents to the clipboard. pub fn write(contents: String) -> Command { Command::single(command::Action::Clipboard(Action::Write( contents, Kind::Standard, ))) } /// Write the given contents to the primary clipboard. pub fn write_primary(contents: String) -> Command { Command::single(command::Action::Clipboard(Action::Write( contents, Kind::Primary, ))) }