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    InvalidBusName(String, String),
15    /// Invalid well-known bus name.
16    InvalidWellKnownName(String),
17    /// Invalid unique bus name.
18    InvalidUniqueName(String),
19    /// Invalid interface name.
20    InvalidInterfaceName(String),
21    /// Invalid member (method or signal) name.
22    InvalidMemberName(String),
23    /// Invalid property name.
24    InvalidPropertyName(String),
25    /// Invalid error name.
26    InvalidErrorName(String),
27}
28
29assert_impl_all!(Error: Send, Sync, Unpin);
30
31impl PartialEq for Error {
32    fn eq(&self, other: &Self) -> bool {
33        match (self, other) {
34            (Self::InvalidBusName(_, _), Self::InvalidBusName(_, _)) => true,
35            (Self::InvalidWellKnownName(_), Self::InvalidWellKnownName(_)) => true,
36            (Self::InvalidUniqueName(_), Self::InvalidUniqueName(_)) => true,
37            (Self::InvalidInterfaceName(_), Self::InvalidInterfaceName(_)) => true,
38            (Self::InvalidMemberName(_), Self::InvalidMemberName(_)) => true,
39            (Self::InvalidPropertyName(_), Self::InvalidPropertyName(_)) => true,
40            (Self::InvalidErrorName(_), Self::InvalidErrorName(_)) => true,
41            (Self::Variant(s), Self::Variant(o)) => s == o,
42            (_, _) => false,
43        }
44    }
45}
46
47impl error::Error for Error {
48    fn source(&self) -> Option<&(dyn error::Error + 'static)> {
49        match self {
50            Error::InvalidBusName(_, _) => None,
51            Error::InvalidWellKnownName(_) => None,
52            Error::InvalidUniqueName(_) => None,
53            Error::InvalidInterfaceName(_) => None,
54            Error::InvalidErrorName(_) => None,
55            Error::InvalidMemberName(_) => None,
56            Error::InvalidPropertyName(_) => None,
57            Error::Variant(e) => Some(e),
58        }
59    }
60}
61
62impl fmt::Display for Error {
63    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
64        match self {
65            Error::Variant(e) => write!(f, "{e}"),
66            Error::InvalidBusName(unique_err, well_known_err) => {
67                write!(
68                    f,
69                    "Neither a valid unique ({unique_err}) nor a well-known ({well_known_err}) bus name"
70                )
71            }
72            Error::InvalidWellKnownName(s) => write!(f, "Invalid well-known bus name: {s}"),
73            Error::InvalidUniqueName(s) => write!(f, "Invalid unique bus name: {s}"),
74            Error::InvalidInterfaceName(s) => write!(f, "Invalid interface or error name: {s}"),
75            Error::InvalidErrorName(s) => write!(f, "Invalid interface or error name: {s}"),
76            Error::InvalidMemberName(s) => write!(f, "Invalid method or signal name: {s}"),
77            Error::InvalidPropertyName(s) => write!(f, "Invalid property name: {s}"),
78        }
79    }
80}
81
82impl From<VariantError> for Error {
83    fn from(val: VariantError) -> Self {
84        Error::Variant(val)
85    }
86}
87
88impl From<Infallible> for Error {
89    fn from(i: Infallible) -> Self {
90        match i {}
91    }
92}
93
94/// Alias for a `Result` with the error type `zbus_names::Error`.
95pub type Result<T> = std::result::Result<T, Error>;