// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

//! # DBus interface proxy for: `xyz.openbmc_project.ObjectMapper`
//!
//! This code was generated by `zbus-xmlgen` `4.0.0` from DBus introspection data.
//! Source: `xyz.openbmc_project.ObjectMapper.xml`.
//!
//! You may prefer to adapt it, instead of using it verbatim.
//!
//! More information can be found in the
//! [Writing a client proxy](https://dbus2.github.io/zbus/client.html)
//! section of the zbus documentation.
//!
//! This DBus object implements
//! [standard DBus interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
//!
//! * [`zbus::fdo::PeerProxy`]
//! * [`zbus::fdo::IntrospectableProxy`]
//! * [`zbus::fdo::PropertiesProxy`]
//!
//! …consequently `zbus-xmlgen` did not generate code for the above interfaces.

use zbus::dbus_proxy;

#[dbus_proxy(interface = "xyz.openbmc_project.ObjectMapper", assume_defaults = true)]
trait ObjectMapper {
    /// GetAncestors method
    fn get_ancestors(
        &self,
        arg_1: &str,
        arg_2: &[&str],
    ) -> zbus::Result<
        std::collections::HashMap<String, std::collections::HashMap<String, Vec<String>>>,
    >;

    /// GetAssociatedSubTree method
    fn get_associated_sub_tree(
        &self,
        arg_1: &zbus::zvariant::ObjectPath<'_>,
        arg_2: &zbus::zvariant::ObjectPath<'_>,
        arg_3: i32,
        arg_4: &[&str],
    ) -> zbus::Result<
        std::collections::HashMap<String, std::collections::HashMap<String, Vec<String>>>,
    >;

    /// GetAssociatedSubTreePaths method
    fn get_associated_sub_tree_paths(
        &self,
        arg_1: &zbus::zvariant::ObjectPath<'_>,
        arg_2: &zbus::zvariant::ObjectPath<'_>,
        arg_3: i32,
        arg_4: &[&str],
    ) -> zbus::Result<Vec<String>>;

    /// GetObject method
    fn get_object(
        &self,
        arg_1: &str,
        arg_2: &[&str],
    ) -> zbus::Result<std::collections::HashMap<String, Vec<String>>>;

    /// GetSubTree method
    fn get_sub_tree(
        &self,
        arg_1: &str,
        arg_2: i32,
        arg_3: &[&str],
    ) -> zbus::Result<
        std::collections::HashMap<String, std::collections::HashMap<String, Vec<String>>>,
    >;

    /// GetSubTreePaths method
    fn get_sub_tree_paths(
        &self,
        arg_1: &str,
        arg_2: i32,
        arg_3: &[&str],
    ) -> zbus::Result<Vec<String>>;
}
