1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
use serde::ser::{Serialize, SerializeTupleStruct, Serializer};
use crate::{Signature, Type, Value};
#[derive(Debug, Clone, Default, PartialEq)]
pub struct Structure<'a>(Vec<Value<'a>>);
impl<'a> Structure<'a> {
pub fn fields(&self) -> &[Value<'a>] {
&self.0
}
pub fn new() -> Self {
Self::default()
}
pub fn add_field<T>(self, field: T) -> Self
where
T: Type + Into<Value<'a>>,
{
self.append_field(Value::new(field))
}
pub fn append_field<'e: 'a>(mut self, field: Value<'e>) -> Self {
self.0.push(field);
self
}
pub fn signature(&self) -> Signature<'static> {
let mut signature = String::from("(");
for field in &self.0 {
signature.push_str(&field.value_signature());
}
signature.push_str(")");
Signature::from_string_unchecked(signature)
}
pub(crate) fn to_owned(&self) -> Structure<'static> {
Structure(self.0.iter().map(|v| v.to_owned()).collect())
}
}
impl<'a> Serialize for Structure<'a> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut structure =
serializer.serialize_tuple_struct("zvariant::Structure", self.0.len())?;
for field in &self.0 {
field.serialize_value_as_tuple_struct_field(&mut structure)?;
}
structure.end()
}
}
macro_rules! tuple_impls {
($($len:expr => ($($n:tt $name:ident)+))+) => {
$(
impl<'a, $($name),+> From<($($name),+,)> for Structure<'a>
where
$($name: Type + Into<Value<'a>>,)+
{
#[inline]
fn from(value: ($($name),+,)) -> Self {
Structure::new()
$(
.add_field(value. $n)
)+
}
}
impl<'a, $($name),+> std::convert::TryFrom<Structure<'a>> for ($($name),+,)
where
$($name: std::convert::TryFrom<Value<'a>>,)+
{
type Error = crate::Error;
fn try_from(mut s: Structure<'a>) -> core::result::Result<Self, Self::Error> {
Ok((
$(
s.0.remove(0).downcast::<$name>().ok_or(crate::Error::IncorrectType)?,
)+
))
}
}
)+
}
}
tuple_impls! {
1 => (0 T0)
2 => (0 T0 1 T1)
3 => (0 T0 1 T1 2 T2)
4 => (0 T0 1 T1 2 T2 3 T3)
5 => (0 T0 1 T1 2 T2 3 T3 4 T4)
6 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5)
7 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6)
8 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7)
9 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8)
10 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9)
11 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10)
12 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11)
13 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12)
14 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13)
15 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14)
16 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15)
}