dbus_addr/
address_list.rs1use std::{borrow::Cow, fmt};
2
3use super::{DBusAddr, Error, OwnedDBusAddr, Result, ToDBusAddrs, ToOwnedDBusAddrs};
4
5#[derive(Debug, PartialEq, Eq, Clone)]
9pub struct DBusAddrList<'a> {
10 addr: Cow<'a, str>,
11}
12
13impl<'a> ToDBusAddrs<'a> for DBusAddrList<'a> {
14 type Iter = DBusAddrListIter<'a>;
15
16 fn to_dbus_addrs(&'a self) -> Self::Iter {
18 DBusAddrListIter::new(self)
19 }
20}
21
22impl<'a> Iterator for DBusAddrListIter<'a> {
23 type Item = Result<DBusAddr<'a>>;
24
25 fn next(&mut self) -> Option<Self::Item> {
26 if self.next_index >= self.data.len() {
27 return None;
28 }
29
30 let mut addr = &self.data[self.next_index..];
31 if let Some(end) = addr.find(';') {
32 addr = &addr[..end];
33 self.next_index += end + 1;
34 } else {
35 self.next_index = self.data.len();
36 }
37
38 Some(DBusAddr::try_from(addr))
39 }
40}
41
42pub struct DBusAddrListIter<'a> {
44 data: &'a str,
45 next_index: usize,
46}
47
48impl<'a> DBusAddrListIter<'a> {
49 fn new(list: &'a DBusAddrList<'_>) -> Self {
50 Self {
51 data: list.addr.as_ref(),
52 next_index: 0,
53 }
54 }
55}
56
57impl<'a> TryFrom<String> for DBusAddrList<'a> {
58 type Error = Error;
59
60 fn try_from(value: String) -> Result<Self> {
61 Ok(Self {
62 addr: Cow::Owned(value),
63 })
64 }
65}
66
67impl<'a> TryFrom<&'a str> for DBusAddrList<'a> {
68 type Error = Error;
69
70 fn try_from(value: &'a str) -> Result<Self> {
71 Ok(Self {
72 addr: Cow::Borrowed(value),
73 })
74 }
75}
76
77impl fmt::Display for DBusAddrList<'_> {
78 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
79 write!(f, "{}", self.addr)
80 }
81}
82
83pub struct OwnedDBusAddrListIter<'a> {
85 data: &'a str,
86 next_index: usize,
87}
88
89impl<'a> ToOwnedDBusAddrs<'a> for DBusAddrList<'a> {
90 type Iter = OwnedDBusAddrListIter<'a>;
91
92 fn to_owned_dbus_addrs(&'a self) -> Self::Iter {
94 OwnedDBusAddrListIter::new(self)
95 }
96}
97
98impl<'a> OwnedDBusAddrListIter<'a> {
99 fn new(list: &'a DBusAddrList<'_>) -> Self {
100 Self {
101 data: list.addr.as_ref(),
102 next_index: 0,
103 }
104 }
105}
106
107impl<'a> Iterator for OwnedDBusAddrListIter<'a> {
108 type Item = Result<OwnedDBusAddr>;
109
110 fn next(&mut self) -> Option<Self::Item> {
111 if self.next_index >= self.data.len() {
112 return None;
113 }
114
115 let mut addr = &self.data[self.next_index..];
116 if let Some(end) = addr.find(';') {
117 addr = &addr[..end];
118 self.next_index += end + 1;
119 } else {
120 self.next_index = self.data.len();
121 }
122
123 Some(OwnedDBusAddr::try_from(addr))
124 }
125}