zbus_names/
error.rs

1use static_assertions::assert_impl_all;
2use std::{convert::Infallible, error, fmt};
3use zvariant::Error as VariantError;
4
5/// The error type for `zbus_names`.
6///
7/// The various errors that can be reported by this crate.
8#[derive(Clone, Debug)]
9#[non_exhaustive]
10pub enum Error {
11    Variant(VariantError),
12    /// Invalid bus name. The strings describe why the bus name is neither a valid unique nor
13    /// well-known name, respectively.
14    #[deprecated(
15        since = "4.1.0",
16        note = "This variant is no longer returned from any of our API.\
17                Use `Error::InvalidName` instead."
18    )]
19    InvalidBusName(String, String),
20    /// Invalid well-known bus name.
21    #[deprecated(
22        since = "4.1.0",
23        note = "This variant is no longer returned from any of our API.\
24                Use `Error::InvalidName` instead."
25    )]
26    InvalidWellKnownName(String),
27    /// Invalid unique bus name.
28    #[deprecated(
29        since = "4.1.0",
30        note = "This variant is no longer returned from any of our API.\
31                Use `Error::InvalidName` instead."
32    )]
33    InvalidUniqueName(String),
34    /// Invalid interface name.
35    #[deprecated(
36        since = "4.1.0",
37        note = "This variant is no longer returned from any of our API.\
38                Use `Error::InvalidName` instead."
39    )]
40    InvalidInterfaceName(String),
41    /// Invalid member (method or signal) name.
42    #[deprecated(
43        since = "4.1.0",
44        note = "This variant is no longer returned from any of our API.\
45                Use `Error::InvalidName` instead."
46    )]
47    InvalidMemberName(String),
48    /// Invalid property name.
49    #[deprecated(
50        since = "4.1.0",
51        note = "This variant is no longer returned from any of our API.\
52                Use `Error::InvalidName` instead."
53    )]
54    InvalidPropertyName(String),
55    /// Invalid error name.
56    #[deprecated(
57        since = "4.1.0",
58        note = "This variant is no longer returned from any of our API.\
59                Use `Error::InvalidName` instead."
60    )]
61    InvalidErrorName(String),
62    /// An invalid name.
63    InvalidName(&'static str),
64    /// Invalid conversion from name type `from` to name type `to`.
65    InvalidNameConversion {
66        from: &'static str,
67        to: &'static str,
68    },
69}
70
71assert_impl_all!(Error: Send, Sync, Unpin);
72
73impl PartialEq for Error {
74    #[allow(deprecated)]
75    fn eq(&self, other: &Self) -> bool {
76        match (self, other) {
77            (Self::InvalidBusName(_, _), Self::InvalidBusName(_, _)) => true,
78            (Self::InvalidWellKnownName(_), Self::InvalidWellKnownName(_)) => true,
79            (Self::InvalidUniqueName(_), Self::InvalidUniqueName(_)) => true,
80            (Self::InvalidInterfaceName(_), Self::InvalidInterfaceName(_)) => true,
81            (Self::InvalidMemberName(_), Self::InvalidMemberName(_)) => true,
82            (Self::InvalidPropertyName(_), Self::InvalidPropertyName(_)) => true,
83            (Self::InvalidErrorName(_), Self::InvalidErrorName(_)) => true,
84            (Self::InvalidName(_), Self::InvalidName(_)) => true,
85            (Self::InvalidNameConversion { .. }, Self::InvalidNameConversion { .. }) => true,
86            (Self::Variant(s), Self::Variant(o)) => s == o,
87            (_, _) => false,
88        }
89    }
90}
91
92impl error::Error for Error {
93    #[allow(deprecated)]
94    fn source(&self) -> Option<&(dyn error::Error + 'static)> {
95        match self {
96            Error::InvalidBusName(_, _) => None,
97            Error::InvalidWellKnownName(_) => None,
98            Error::InvalidUniqueName(_) => None,
99            Error::InvalidInterfaceName(_) => None,
100            Error::InvalidErrorName(_) => None,
101            Error::InvalidMemberName(_) => None,
102            Error::InvalidPropertyName(_) => None,
103            Error::InvalidName(_) => None,
104            Error::InvalidNameConversion { .. } => None,
105            Error::Variant(e) => Some(e),
106        }
107    }
108}
109
110impl fmt::Display for Error {
111    #[allow(deprecated)]
112    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
113        match self {
114            Error::Variant(e) => write!(f, "{e}"),
115            Error::InvalidBusName(unique_err, well_known_err) => {
116                write!(
117                    f,
118                    "Neither a valid unique ({unique_err}) nor a well-known ({well_known_err}) bus name"
119                )
120            }
121            Error::InvalidWellKnownName(s) => write!(f, "Invalid well-known bus name: {s}"),
122            Error::InvalidUniqueName(s) => write!(f, "Invalid unique bus name: {s}"),
123            Error::InvalidInterfaceName(s) => write!(f, "Invalid interface or error name: {s}"),
124            Error::InvalidErrorName(s) => write!(f, "Invalid interface or error name: {s}"),
125            Error::InvalidMemberName(s) => write!(f, "Invalid method or signal name: {s}"),
126            Error::InvalidPropertyName(s) => write!(f, "Invalid property name: {s}"),
127            Error::InvalidName(s) => write!(f, "{s}"),
128            Error::InvalidNameConversion { from, to } => {
129                write!(f, "Invalid conversion from `{from}` to `{to}`")
130            }
131        }
132    }
133}
134
135impl From<VariantError> for Error {
136    fn from(val: VariantError) -> Self {
137        Error::Variant(val)
138    }
139}
140
141impl From<Infallible> for Error {
142    fn from(i: Infallible) -> Self {
143        match i {}
144    }
145}
146
147/// Alias for a `Result` with the error type `zbus_names::Error`.
148pub type Result<T> = std::result::Result<T, Error>;