use super::{HandleToken, DESTINATION, PATH};
use crate::{helpers::call_basic_response_method, Error};
use serde::{Deserialize, Serialize, Serializer};
use strum_macros::{AsRefStr, EnumString, IntoStaticStr, ToString};
use zvariant::Signature;
use zvariant_derive::{DeserializeDict, SerializeDict, TypeDict};
#[derive(SerializeDict, DeserializeDict, TypeDict, Clone, Debug, Default)]
struct AccessDeviceOptions {
handle_token: HandleToken,
}
#[derive(
Debug, Clone, Copy, Deserialize, EnumString, AsRefStr, IntoStaticStr, ToString, PartialEq, Eq,
)]
#[strum(serialize_all = "lowercase")]
pub enum Device {
Microphone,
Speakers,
Camera,
}
impl zvariant::Type for Device {
fn signature() -> Signature<'static> {
String::signature()
}
}
impl Serialize for Device {
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
where
S: Serializer,
{
String::serialize(&self.to_string(), serializer)
}
}
#[derive(Debug)]
#[doc(alias = "org.freedesktop.portal.Device")]
pub struct DeviceProxy<'a>(zbus::azync::Proxy<'a>);
impl<'a> DeviceProxy<'a> {
pub async fn new(connection: &zbus::azync::Connection) -> Result<DeviceProxy<'a>, Error> {
let proxy = zbus::ProxyBuilder::new_bare(connection)
.interface("org.freedesktop.portal.Device")
.path(PATH)?
.destination(DESTINATION)
.build_async()
.await?;
Ok(Self(proxy))
}
pub fn inner(&self) -> &zbus::azync::Proxy<'_> {
&self.0
}
#[doc(alias = "AccessDevice")]
pub async fn access_device(&self, pid: u32, devices: &[Device]) -> Result<(), Error> {
let options = AccessDeviceOptions::default();
call_basic_response_method(
&self.0,
&options.handle_token,
"AccessDevice",
&(pid, devices, &options),
)
.await
}
}