[][src]Type Definition rustbus::connection::rpc_conn::MessageFilter

type MessageFilter = Box<dyn Fn(&MarshalledMessage) -> bool + Sync + Send>;

Filter out messages you dont want in your RpcConn. If this filters out a call, the RpcConn will send a UnknownMethod error to the caller. Other messages are just dropped if the filter returns false.

use rustbus::{get_session_bus_path, standard_messages, DuplexConn, params::Container, params::DictMap, MessageBuilder, MessageType, RpcConn};

fn main() -> Result<(), rustbus::connection::Error> {
    let session_path = get_session_bus_path()?;
    let con = DuplexConn::connect_to_bus(session_path, true)?;
    let mut rpc_con = RpcConn::new(con);

    rpc_con.set_filter(Box::new(|msg| match msg.typ {
    MessageType::Call => {
        let right_interface_object = msg.dynheader.object.eq(&Some("/io/killing/spark".into()))
            && msg.dynheader.interface.eq(&Some("io.killing.spark".into()));

        let right_member = if let Some(member) = &msg.dynheader.member {
            member.eq("Echo") || member.eq("Reverse")
        } else {
            false
        };
        let keep = right_interface_object && right_member;
        if !keep {
            println!("Discard: {:?}", msg);
        }
        keep
    }
    MessageType::Invalid => false,
    MessageType::Error => true,
    MessageType::Reply => true,
    MessageType::Signal => false,
}));

Ok(())
}