Skip to main content

asimov_protocol/
peer_feature_set.rs

1// This is free and unencumbered software released into the public domain.
2
3use 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}