dbus_addr/
address_list.rs

1use std::{borrow::Cow, fmt};
2
3use super::{DBusAddr, Error, OwnedDBusAddr, Result, ToDBusAddrs, ToOwnedDBusAddrs};
4
5/// A bus address list.
6///
7/// D-Bus addresses are `;`-separated.
8#[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    /// Get an iterator over the D-Bus addresses.
17    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
42/// An iterator of D-Bus addresses.
43pub 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
83/// An iterator of D-Bus addresses.
84pub 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    /// Get an iterator over the D-Bus addresses.
93    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}