#[cfg(not(target_os = "macos"))]
use anyhow::anyhow;
use anyhow::Result;
use image::io::Reader;
use image::DynamicImage;
use image::ImageFormat::Png;
use tempfile::NamedTempFile;
use tokio::process::Command;
pub async fn from_clipboard() -> Result<DynamicImage> {
#[cfg(target_os = "macos")]
return from_clipboard_for_darwin().await;
#[cfg(not(target_os = "macos"))]
return from_clipboard_for_linux().await;
}
#[cfg(target_os = "macos")]
async fn from_clipboard_for_darwin() -> Result<DynamicImage> {
let temp_file = NamedTempFile::new()?;
let temp_file_path = temp_file.path().to_str().unwrap();
let script_to_copy = &format!(
"write (the clipboard as «class PNGf») to (open for access \"{}\" with write permission)",
temp_file_path
);
Command::new("osascript")
.args(&["-e", script_to_copy])
.spawn()?
.await?;
let img = Reader::open(temp_file_path)?
.with_guessed_format()?
.decode()?;
temp_file.close()?;
Ok(img)
}
#[cfg(not(target_os = "macos"))]
async fn from_clipboard_for_linux() -> Result<DynamicImage> {
Err(anyhow!(
"This crate does not support any OS other than macOS"
))
}
pub async fn to_clipboard(img: DynamicImage) -> Result<()> {
#[cfg(target_os = "macos")]
return to_clipboard_for_darwin(img).await;
#[cfg(not(target_os = "macos"))]
return to_clipboard_for_linux(img).await;
}
#[cfg(target_os = "macos")]
async fn to_clipboard_for_darwin(img: DynamicImage) -> Result<()> {
let temp_file = NamedTempFile::new()?;
let temp_file_path = temp_file.path().to_str().unwrap();
img.save_with_format(temp_file_path, Png).unwrap();
let script_to_copy = &format!(
"set the clipboard to (read \"{}\" as «class PNGf»)",
temp_file_path
);
Command::new("osascript")
.args(&["-e", script_to_copy])
.spawn()?
.await?;
temp_file.close()?;
Ok(())
}
#[cfg(not(target_os = "macos"))]
async fn to_clipboard_for_linux(_: DynamicImage) -> Result<()> {
Err(anyhow!(
"This crate does not support any OS other than macOS"
))
}