use std::os::unix::io::AsRawFd;
use serde_repr::{Deserialize_repr, Serialize_repr};
use zbus::zvariant::{Fd, Type};
use super::{DESTINATION, PATH};
use crate::{error::PortalError, helpers::call_method, Error};
#[derive(Serialize_repr, Deserialize_repr, PartialEq, Clone, Copy, Hash, Debug, Type)]
#[repr(u8)]
enum TrashStatus {
Failed = 0,
Succeeded = 1,
}
#[derive(Debug)]
#[doc(alias = "org.freedesktop.portal.Trash")]
pub struct TrashProxy<'a>(zbus::Proxy<'a>);
impl<'a> TrashProxy<'a> {
pub async fn new(connection: &zbus::Connection) -> Result<TrashProxy<'a>, Error> {
let proxy = zbus::ProxyBuilder::new_bare(connection)
.interface("org.freedesktop.portal.Trash")?
.path(PATH)?
.destination(DESTINATION)?
.build()
.await?;
Ok(Self(proxy))
}
pub fn inner(&self) -> &zbus::Proxy<'_> {
&self.0
}
#[doc(alias = "TrashFile")]
#[doc(alias = "xdp_portal_trash_file")]
pub async fn trash_file(&self, fd: &impl AsRawFd) -> Result<(), Error> {
let status = call_method(self.inner(), "TrashFile", &(Fd::from(fd.as_raw_fd()))).await?;
match status {
TrashStatus::Failed => Err(Error::Portal(PortalError::Failed)),
TrashStatus::Succeeded => Ok(()),
}
}
}
#[doc(alias = "xdp_portal_trash_file")]
pub async fn trash_file(fd: &impl AsRawFd) -> Result<(), Error> {
let connection = zbus::Connection::session().await?;
let proxy = TrashProxy::new(&connection).await?;
proxy.trash_file(fd).await
}
#[cfg(test)]
mod test {
use super::TrashStatus;
#[test]
fn status_serde() {
#[derive(Debug, serde::Serialize, serde::Deserialize)]
struct Test {
status: TrashStatus,
}
let status = Test {
status: TrashStatus::Failed,
};
let x = serde_json::to_string(&status).unwrap();
let y: Test = serde_json::from_str(&x).unwrap();
assert_eq!(y.status, TrashStatus::Failed);
}
}