tokio_dbus/message/
message_kind.rs

1use std::num::NonZeroU32;
2
3use crate::{message::OwnedMessageKind, ObjectPath};
4
5/// The kind of a D-Bus message.
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7#[non_exhaustive]
8pub enum MessageKind<'a> {
9    /// Method call. This message type may prompt a reply.
10    MethodCall {
11        /// The path being called.
12        path: &'a ObjectPath,
13        /// The member being called.
14        member: &'a str,
15    },
16    /// Method reply with returned data.
17    MethodReturn {
18        /// The serial this is a reply to.
19        reply_serial: NonZeroU32,
20    },
21    /// Error reply. If the first argument exists and is a string, it is an
22    /// error message.
23    Error {
24        /// The name of the error.
25        error_name: &'a str,
26        /// The serial this is a reply to.
27        reply_serial: NonZeroU32,
28    },
29    /// Signal emission.
30    Signal {
31        /// The member being signalled.
32        member: &'a str,
33    },
34}
35
36impl MessageKind<'_> {
37    #[inline]
38    pub(crate) fn to_owned(self) -> OwnedMessageKind {
39        match self {
40            MessageKind::MethodCall { path, member } => OwnedMessageKind::MethodCall {
41                path: path.into(),
42                member: member.into(),
43            },
44            MessageKind::MethodReturn { reply_serial } => {
45                OwnedMessageKind::MethodReturn { reply_serial }
46            }
47            MessageKind::Error {
48                error_name,
49                reply_serial,
50            } => OwnedMessageKind::Error {
51                error_name: error_name.into(),
52                reply_serial,
53            },
54            MessageKind::Signal { member } => OwnedMessageKind::Signal {
55                member: member.into(),
56            },
57        }
58    }
59}
60
61impl PartialEq<OwnedMessageKind> for MessageKind<'_> {
62    fn eq(&self, other: &OwnedMessageKind) -> bool {
63        match (*self, other) {
64            (
65                MessageKind::MethodCall {
66                    path: path_left,
67                    member: member_left,
68                },
69                OwnedMessageKind::MethodCall {
70                    path: path_right,
71                    member: member_right,
72                },
73            ) => *path_left == **path_right && *member_left == **member_right,
74            (
75                MessageKind::MethodReturn {
76                    reply_serial: reply_serial_left,
77                },
78                OwnedMessageKind::MethodReturn {
79                    reply_serial: reply_serial_right,
80                },
81            ) => reply_serial_left == *reply_serial_right,
82            (
83                MessageKind::Error {
84                    error_name: error_name_left,
85                    reply_serial: reply_serial_left,
86                },
87                OwnedMessageKind::Error {
88                    error_name: error_name_right,
89                    reply_serial: reply_serial_right,
90                },
91            ) => *error_name_left == **error_name_right && reply_serial_left == *reply_serial_right,
92            (
93                MessageKind::Signal {
94                    member: member_left,
95                },
96                OwnedMessageKind::Signal {
97                    member: member_right,
98                },
99            ) => *member_left == **member_right,
100            _ => false,
101        }
102    }
103}