1use std::borrow::Cow;
2
3use serde::Deserialize;
4use serde::Serialize;
5
6use crate::Node;
7use crate::Pid;
8use crate::Reference;
9
10#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
12pub enum Dest {
13 Pid(Pid),
15 Named(Cow<'static, str>, Node),
17 Alias(Reference),
19}
20
21#[derive(Debug)]
23pub enum Dests {
24 Dest(Dest),
26 Dests(Vec<Dest>),
28}
29
30impl Dest {
31 pub const fn is_local(&self) -> bool {
33 match self {
34 Self::Pid(pid) => pid.is_local(),
35 Self::Named(_, node) => node.is_local(),
36 Self::Alias(reference) => reference.is_local(),
37 }
38 }
39
40 pub const fn is_remote(&self) -> bool {
42 match self {
43 Self::Pid(pid) => pid.is_remote(),
44 Self::Named(_, node) => node.is_remote(),
45 Self::Alias(reference) => reference.is_remote(),
46 }
47 }
48}
49
50impl From<Pid> for Dest {
51 fn from(value: Pid) -> Self {
52 Self::Pid(value)
53 }
54}
55
56impl From<&'static str> for Dest {
57 fn from(value: &'static str) -> Self {
58 Self::Named(value.into(), Node::Local)
59 }
60}
61
62impl From<String> for Dest {
63 fn from(value: String) -> Self {
64 Self::Named(value.into(), Node::Local)
65 }
66}
67
68impl<T> From<(String, T)> for Dest
69where
70 T: Into<Node>,
71{
72 fn from(value: (String, T)) -> Self {
73 Self::Named(value.0.into(), value.1.into())
74 }
75}
76
77impl<T> From<(&'static str, T)> for Dest
78where
79 T: Into<Node>,
80{
81 fn from(value: (&'static str, T)) -> Self {
82 Self::Named(value.0.into(), value.1.into())
83 }
84}
85
86impl From<Reference> for Dest {
87 fn from(value: Reference) -> Self {
88 Self::Alias(value)
89 }
90}
91
92impl PartialEq<Pid> for Dest {
93 fn eq(&self, other: &Pid) -> bool {
94 match self {
95 Self::Pid(pid) => pid == other,
96 _ => false,
97 }
98 }
99}
100
101impl PartialEq<Dest> for Pid {
102 fn eq(&self, other: &Dest) -> bool {
103 match other {
104 Dest::Pid(pid) => self == pid,
105 _ => false,
106 }
107 }
108}
109
110impl PartialEq<&str> for Dest {
111 fn eq(&self, other: &&str) -> bool {
112 match self {
113 Self::Named(name, _) => name == other,
114 _ => false,
115 }
116 }
117}
118
119impl PartialEq<Dest> for &str {
120 fn eq(&self, other: &Dest) -> bool {
121 match other {
122 Dest::Named(name, _) => self == name,
123 _ => false,
124 }
125 }
126}
127
128impl PartialEq<Reference> for Dest {
129 fn eq(&self, other: &Reference) -> bool {
130 match self {
131 Self::Alias(reference) => reference == other,
132 _ => false,
133 }
134 }
135}
136
137impl PartialEq<Dest> for Reference {
138 fn eq(&self, other: &Dest) -> bool {
139 match other {
140 Dest::Alias(reference) => reference == other,
141 _ => false,
142 }
143 }
144}
145
146impl From<Pid> for Dests {
147 fn from(value: Pid) -> Self {
148 Self::Dest(Dest::from(value))
149 }
150}
151
152impl From<Reference> for Dests {
153 fn from(value: Reference) -> Self {
154 Self::Dest(Dest::from(value))
155 }
156}
157
158impl From<&'static str> for Dests {
159 fn from(value: &'static str) -> Self {
160 Self::Dest(Dest::Named(value.into(), Node::Local))
161 }
162}
163
164impl<T> From<(String, T)> for Dests
165where
166 T: Into<Node>,
167{
168 fn from(value: (String, T)) -> Self {
169 Self::Dest(Dest::Named(value.0.into(), value.1.into()))
170 }
171}
172
173impl<T> From<(&'static str, T)> for Dests
174where
175 T: Into<Node>,
176{
177 fn from(value: (&'static str, T)) -> Self {
178 Self::Dest(Dest::Named(value.0.into(), value.1.into()))
179 }
180}
181
182impl From<String> for Dests {
183 fn from(value: String) -> Self {
184 Self::Dest(Dest::Named(value.into(), Node::Local))
185 }
186}
187
188impl From<&[Pid]> for Dests {
189 fn from(value: &[Pid]) -> Self {
190 if value.len() == 1 {
191 Self::Dest(Dest::from(value[0]))
192 } else {
193 Self::Dests(value.iter().copied().map(Into::into).collect())
194 }
195 }
196}
197
198impl From<Dest> for Dests {
199 fn from(value: Dest) -> Self {
200 Self::Dest(value)
201 }
202}
203
204impl From<&[Dest]> for Dests {
205 fn from(value: &[Dest]) -> Self {
206 if value.len() == 1 {
207 Self::Dest(value[0].to_owned())
208 } else {
209 Self::Dests(Vec::from(value))
210 }
211 }
212}
213
214impl From<Vec<Dest>> for Dests {
215 fn from(value: Vec<Dest>) -> Self {
216 Self::Dests(value)
217 }
218}
219
220impl From<Vec<Pid>> for Dests {
221 fn from(value: Vec<Pid>) -> Self {
222 Self::Dests(value.into_iter().map(Into::into).collect())
223 }
224}
225
226impl From<&Vec<Pid>> for Dests {
227 fn from(value: &Vec<Pid>) -> Self {
228 Self::Dests(value.iter().copied().map(Into::into).collect())
229 }
230}
231
232impl FromIterator<Dest> for Dests {
233 fn from_iter<T: IntoIterator<Item = Dest>>(iter: T) -> Self {
234 Self::Dests(Vec::from_iter(iter))
235 }
236}
237
238impl FromIterator<Pid> for Dests {
239 fn from_iter<T: IntoIterator<Item = Pid>>(iter: T) -> Self {
240 Self::Dests(Vec::from_iter(iter.into_iter().map(Into::into)))
241 }
242}