zvariant_utils/signature/
fields.rs1use super::Signature;
2
3#[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 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 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 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}