dbus_message_parser/value/bus/
mod.rs1use 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#[derive(Debug, Clone, PartialOrd, PartialEq, Ord, Eq)]
16pub enum Bus {
17 UniqueConnectionName(UniqueConnectionName),
18 WellKnownBusName(WellKnownBusName),
19}
20
21#[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}