zbus_names/
error.rs

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