use static_assertions::assert_impl_all;
use std::{borrow::Cow, collections::HashMap};
use zbus_names::{InterfaceName, OwnedInterfaceName};
use zvariant::{ObjectPath, OwnedObjectPath, OwnedValue, Value};
use super::{Error, Result};
use crate::{interface, message::Header, object_server::SignalEmitter, Connection, ObjectServer};
pub type ManagedObjects =
HashMap<OwnedObjectPath, HashMap<OwnedInterfaceName, HashMap<String, OwnedValue>>>;
#[derive(Debug, Clone)]
pub struct ObjectManager;
#[interface(
name = "org.freedesktop.DBus.ObjectManager",
introspection_docs = false,
proxy(visibility = "pub")
)]
impl ObjectManager {
async fn get_managed_objects(
&self,
#[zbus(object_server)] server: &ObjectServer,
#[zbus(connection)] connection: &Connection,
#[zbus(header)] header: Header<'_>,
) -> Result<ManagedObjects> {
let path = header.path().ok_or(crate::Error::MissingField)?;
let root = server.root().read().await;
let node = root
.get_child(path)
.ok_or_else(|| Error::UnknownObject(format!("Unknown object '{path}'")))?;
node.get_managed_objects(server, connection).await
}
#[zbus(signal)]
pub async fn interfaces_added(
emitter: &SignalEmitter<'_>,
object_path: ObjectPath<'_>,
interfaces_and_properties: HashMap<InterfaceName<'_>, HashMap<&str, Value<'_>>>,
) -> zbus::Result<()>;
#[zbus(signal)]
pub async fn interfaces_removed(
emitter: &SignalEmitter<'_>,
object_path: ObjectPath<'_>,
interfaces: Cow<'_, [InterfaceName<'_>]>,
) -> zbus::Result<()>;
}
assert_impl_all!(ObjectManagerProxy<'_>: Send, Sync, Unpin);
#[cfg(feature = "blocking-api")]
assert_impl_all!(ObjectManagerProxyBlocking<'_>: Send, Sync, Unpin);