zvariant_utils/signature/
fields.rs

1use super::Signature;
2
3/// Signatures of the fields of a [`Signature::Structure`].
4#[derive(Debug, Clone)]
5pub enum Fields {
6    Static {
7        fields: &'static [&'static Signature],
8    },
9    Dynamic {
10        fields: Box<[Signature]>,
11    },
12}
13static_assertions::assert_impl_all!(Fields: Send, Sync, Unpin);
14
15impl Fields {
16    /// A iterator over the fields' signatures.
17    pub fn iter(&self) -> impl Iterator<Item = &Signature> {
18        use std::slice::Iter;
19
20        enum Fields<'a> {
21            Static(Iter<'static, &'static Signature>),
22            Dynamic(Iter<'a, Signature>),
23        }
24
25        impl<'a> Iterator for Fields<'a> {
26            type Item = &'a Signature;
27
28            fn next(&mut self) -> Option<Self::Item> {
29                match self {
30                    Fields::Static(iter) => iter.next().copied(),
31                    Fields::Dynamic(iter) => iter.next(),
32                }
33            }
34        }
35
36        match self {
37            Self::Static { fields } => Fields::Static(fields.iter()),
38            Self::Dynamic { fields } => Fields::Dynamic(fields.iter()),
39        }
40    }
41
42    /// The number of fields.
43    pub const fn len(&self) -> usize {
44        match self {
45            Self::Static { fields } => fields.len(),
46            Self::Dynamic { fields } => fields.len(),
47        }
48    }
49
50    /// Whether there are no fields.
51    pub fn is_empty(&self) -> bool {
52        self.len() == 0
53    }
54}
55
56impl From<Box<[Signature]>> for Fields {
57    fn from(fields: Box<[Signature]>) -> Self {
58        Fields::Dynamic { fields }
59    }
60}
61
62impl From<Vec<Signature>> for Fields {
63    fn from(fields: Vec<Signature>) -> Self {
64        Fields::Dynamic {
65            fields: fields.into(),
66        }
67    }
68}
69
70impl<const N: usize> From<[Signature; N]> for Fields {
71    fn from(fields: [Signature; N]) -> Self {
72        Fields::Dynamic {
73            fields: fields.into(),
74        }
75    }
76}
77
78impl From<&'static [&'static Signature]> for Fields {
79    fn from(fields: &'static [&'static Signature]) -> Self {
80        Fields::Static { fields }
81    }
82}