asimov_protocol/
peer_feature_set.rs1use alloc::vec::Vec;
4use serde::{Deserialize, Deserializer, Serialize};
5
6type String = heapless::String<32>;
7
8#[derive(Clone, Debug, Eq, Serialize, PartialEq)]
9#[serde(untagged)]
10pub enum NodeFeatureSet<'a> {
11 Borrowed(&'a [&'a str]),
12 Owned(Vec<String>),
13}
14
15impl<'a> NodeFeatureSet<'a> {
16 pub fn iter(&'a self) -> FeatureIter<'a> {
17 match self {
18 NodeFeatureSet::Borrowed(slice) => FeatureIter::Borrowed(slice.iter()),
19 NodeFeatureSet::Owned(vec) => FeatureIter::Owned(vec.iter()),
20 }
21 }
22}
23
24impl<'de, 'a> Deserialize<'de> for NodeFeatureSet<'a> {
25 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
26 where
27 D: Deserializer<'de>,
28 {
29 let vec = Vec::<String>::deserialize(deserializer)?;
30 Ok(NodeFeatureSet::Owned(vec))
31 }
32}
33
34pub enum FeatureIter<'a> {
35 Borrowed(core::slice::Iter<'a, &'a str>),
36 Owned(core::slice::Iter<'a, String>),
37}
38
39impl<'a> Iterator for FeatureIter<'a> {
40 type Item = &'a str;
41
42 fn next(&mut self) -> Option<Self::Item> {
43 match self {
44 FeatureIter::Borrowed(iter) => iter.next().copied(),
45 FeatureIter::Owned(iter) => iter.next().map(|s| s.as_str()),
46 }
47 }
48}