dbus_message_parser/value/bus/
mod.rs

1use std::cmp::{Eq, PartialEq};
2use std::convert::{From, TryFrom};
3use std::fmt::{Display, Formatter, Result as FmtResult};
4use thiserror::Error;
5
6mod unique_connection_name;
7mod well_known_bus_name;
8
9pub use unique_connection_name::{UniqueConnectionName, UniqueConnectionNameError};
10pub use well_known_bus_name::{WellKnownBusName, WellKnownBusNameError};
11
12/// This represents a [bus name].
13///
14/// [bus name]: https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-bus
15#[derive(Debug, Clone, PartialOrd, PartialEq, Ord, Eq)]
16pub enum Bus {
17    UniqueConnectionName(UniqueConnectionName),
18    WellKnownBusName(WellKnownBusName),
19}
20
21/// An enum representing all errors, which can occur during the handling of a [`Bus`].
22#[derive(Debug, PartialEq, Eq, Error)]
23pub enum BusError {
24    #[error("Could not parse unique connection name: {0}")]
25    UniqueConnectionNameError(#[from] UniqueConnectionNameError),
26    #[error("Could not parse well-known bus name: {0}")]
27    WellKnownBusNameError(#[from] WellKnownBusNameError),
28}
29
30impl From<Bus> for String {
31    fn from(bus: Bus) -> Self {
32        match bus {
33            Bus::UniqueConnectionName(unique_connection_name) => unique_connection_name.into(),
34            Bus::WellKnownBusName(well_known_bus_name) => well_known_bus_name.into(),
35        }
36    }
37}
38
39impl TryFrom<String> for Bus {
40    type Error = BusError;
41
42    fn try_from(bus: String) -> Result<Self, Self::Error> {
43        if bus.starts_with(':') {
44            let unique_connection_name = UniqueConnectionName::try_from(bus)?;
45            Ok(Bus::UniqueConnectionName(unique_connection_name))
46        } else {
47            let well_known_bus_name = WellKnownBusName::try_from(bus)?;
48            Ok(Bus::WellKnownBusName(well_known_bus_name))
49        }
50    }
51}
52
53impl TryFrom<&str> for Bus {
54    type Error = BusError;
55
56    fn try_from(bus: &str) -> Result<Self, Self::Error> {
57        if bus.starts_with(':') {
58            let unique_connection_name = UniqueConnectionName::try_from(bus)?;
59            Ok(Bus::UniqueConnectionName(unique_connection_name))
60        } else {
61            let well_known_bus_name = WellKnownBusName::try_from(bus)?;
62            Ok(Bus::WellKnownBusName(well_known_bus_name))
63        }
64    }
65}
66
67impl TryFrom<&[u8]> for Bus {
68    type Error = BusError;
69
70    fn try_from(bus: &[u8]) -> Result<Self, Self::Error> {
71        if bus.starts_with(&[b':'][..]) {
72            let unique_connection_name = UniqueConnectionName::try_from(bus)?;
73            Ok(Bus::UniqueConnectionName(unique_connection_name))
74        } else {
75            let well_known_bus_name = WellKnownBusName::try_from(bus)?;
76            Ok(Bus::WellKnownBusName(well_known_bus_name))
77        }
78    }
79}
80
81impl Display for Bus {
82    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
83        match self {
84            Bus::UniqueConnectionName(unique_connection_name) => {
85                write!(f, "{}", unique_connection_name)
86            }
87            Bus::WellKnownBusName(well_known_bus_name) => {
88                write!(f, "{}", well_known_bus_name)
89            }
90        }
91    }
92}
93
94impl AsRef<str> for Bus {
95    fn as_ref(&self) -> &str {
96        match self {
97            Bus::UniqueConnectionName(unique_connection_name) => unique_connection_name.as_ref(),
98            Bus::WellKnownBusName(well_known_bus_name) => well_known_bus_name.as_ref(),
99        }
100    }
101}
102
103impl PartialEq<str> for Bus {
104    fn eq(&self, other: &str) -> bool {
105        if other.starts_with(':') {
106            match self {
107                Bus::UniqueConnectionName(unique_connection_name) => {
108                    unique_connection_name.eq(other)
109                }
110                Bus::WellKnownBusName(_) => false,
111            }
112        } else {
113            match self {
114                Bus::UniqueConnectionName(_) => false,
115                Bus::WellKnownBusName(well_known_bus_name) => well_known_bus_name.eq(other),
116            }
117        }
118    }
119}