#![cfg(windows)]
#![warn(missing_docs)]
#![cfg_attr(feature = "cargo-clippy", allow(clippy::style))]
pub mod formats;
pub mod raw;
pub mod dib;
pub mod utils;
use std::{io};
use std::path::PathBuf;
pub struct Clipboard {
inner: ()
}
impl Clipboard {
#[inline]
pub fn new() -> io::Result<Clipboard> {
raw::open().map(|_| Clipboard { inner: () })
}
#[inline]
pub fn new_attempts(mut num: usize) -> io::Result<Clipboard> {
loop {
match raw::open() {
Ok(_) => break Ok(Clipboard { inner: () }),
Err(error) => match num {
0 => break Err(error),
_ => num -= 1
},
}
}
}
#[inline]
pub fn empty(&self) -> io::Result<&Clipboard> {
raw::empty().map(|_| self)
}
#[inline]
pub fn size(&self, format: u32) -> Option<usize> {
raw::size(format)
}
#[inline]
pub fn set(&self, format: u32, data: &[u8]) -> io::Result<()> {
raw::set(format, data)
}
#[inline]
pub fn set_string(&self, text: &str) -> io::Result<()> {
raw::set_string(text)
}
#[inline]
pub fn get(&self, format: u32, data: &mut [u8]) -> io::Result<usize> {
raw::get(format, data)
}
#[inline]
pub fn get_string(&self, storage: &mut String) -> io::Result<()> {
raw::get_string(storage)
}
#[inline]
pub fn get_file_list(&self) -> io::Result<Vec<PathBuf>> {
raw::get_file_list()
}
#[inline]
pub fn get_dib(&self) -> io::Result<dib::Image> {
raw::get_clipboard_data(formats::CF_DIB).or_else(|_| raw::get_clipboard_data(formats::CF_DIBV5))
.and_then(|handle| dib::Image::from_handle(handle.as_ptr()))
}
#[inline]
pub fn enum_formats(&self) -> raw::EnumFormats {
raw::EnumFormats::new()
}
#[inline]
pub fn seq_num() -> Option<u32> {
raw::seq_num()
}
#[inline]
pub fn is_format_avail(format: u32) -> bool {
raw::is_format_avail(format)
}
#[inline]
pub fn count_formats() -> io::Result<i32> {
raw::count_formats()
}
}
impl Drop for Clipboard {
fn drop(&mut self) {
let _ = raw::close();
self.inner
}
}
#[inline]
pub fn get_clipboard_string() -> io::Result<String> {
let mut data = String::new();
Clipboard::new_attempts(10)?.get_string(&mut data).map(|_| data)
}
#[inline]
pub fn set_clipboard_string(data: &str) -> io::Result<()> {
Clipboard::new_attempts(10)?.set_string(data)
}