use super::platform::ClipboardError;
use super::{DataFormat, DataFormatOf, IAsyncDataTransferItem, LocalBoxFuture};
use crate::media::imaging::Bitmap;
use crate::platform::storage::IStorageItem;
use std::rc::Rc;
pub trait AsyncDataTransferItemExtensions: IAsyncDataTransferItem {
fn contains(&self, format: &DataFormat) -> bool {
self.formats().iter().any(|candidate| candidate == format)
}
fn try_contains(&self, format: &DataFormat) -> Result<bool, ClipboardError> {
Ok(self.try_formats()?.iter().any(|candidate| candidate == format))
}
fn try_get_value_async<T: Clone + 'static>(
&self,
format: &DataFormatOf<T>,
) -> LocalBoxFuture<Result<Option<T>, ClipboardError>> {
let raw = self.try_get_raw_async(format);
Box::pin(async move { Ok(raw.await?.and_then(|value| value.downcast_ref::<T>().cloned())) })
}
fn try_get_text_async(&self) -> LocalBoxFuture<Result<Option<String>, ClipboardError>> {
self.try_get_value_async(&DataFormat::text())
}
fn try_get_bitmap_async(&self) -> LocalBoxFuture<Result<Option<Rc<Bitmap>>, ClipboardError>> {
self.try_get_value_async(&DataFormat::bitmap())
}
fn try_get_file_async(&self) -> LocalBoxFuture<Result<Option<Rc<dyn IStorageItem>>, ClipboardError>> {
self.try_get_value_async(&DataFormat::file())
}
}
impl<I: IAsyncDataTransferItem + ?Sized> AsyncDataTransferItemExtensions for I {}