tangled
alpha
login
or
join now
buttplug.io
/
buttplug
20
fork
atom
Buttplug sex toy control library
20
fork
atom
overview
issues
pulls
pipelines
chore: Fix serialization of user ranges
qdot.tngl.sh
5 months ago
b4fcc485
1969d738
+27
-9
2 changed files
expand all
collapse all
unified
split
crates
buttplug_core
src
util
range_serialize.rs
buttplug_server_device_config
src
device_config_file
feature.rs
+18
-4
crates/buttplug_core/src/util/range_serialize.rs
···
1
1
use std::ops::RangeInclusive;
2
2
3
3
-
use serde::{Serializer, ser::SerializeSeq};
3
3
+
use serde::{Serializer, Serialize, ser::SerializeSeq};
4
4
5
5
-
pub fn range_serialize<S>(range: &RangeInclusive<i32>, serializer: S) -> Result<S::Ok, S::Error>
5
5
+
pub fn option_range_serialize<S, T>(range: &Option<RangeInclusive<T>>, serializer: S) -> Result<S::Ok, S::Error>
6
6
where
7
7
S: Serializer,
8
8
+
T: Serialize
9
9
+
{
10
10
+
if let Some(r) = range {
11
11
+
range_serialize(r, serializer)
12
12
+
} else {
13
13
+
core::option::Option::None::<T>.serialize(serializer)
14
14
+
}
15
15
+
}
16
16
+
17
17
+
pub fn range_serialize<S, T>(range: &RangeInclusive<T>, serializer: S) -> Result<S::Ok, S::Error>
18
18
+
where
19
19
+
S: Serializer,
20
20
+
T: Serialize
8
21
{
9
22
let mut seq = serializer.serialize_seq(Some(2))?;
10
23
seq.serialize_element(&range.start())?;
···
12
25
seq.end()
13
26
}
14
27
15
15
-
pub fn range_sequence_serialize<S>(
16
16
-
range_vec: &Vec<RangeInclusive<i32>>,
28
28
+
pub fn range_sequence_serialize<S,T>(
29
29
+
range_vec: &Vec<RangeInclusive<T>>,
17
30
serializer: S,
18
31
) -> Result<S::Ok, S::Error>
19
32
where
20
33
S: Serializer,
34
34
+
T: Serialize + Copy + Clone,
21
35
{
22
36
let mut seq = serializer.serialize_seq(Some(range_vec.len()))?;
23
37
for range in range_vec {
+9
-5
crates/buttplug_server_device_config/src/device_config_file/feature.rs
···
11
11
ServerDeviceFeatureOutputPositionWithDurationProperties,
12
12
ServerDeviceFeatureOutputValueProperties,
13
13
};
14
14
-
use buttplug_core::{message::InputCommandType, util::range_serialize::range_sequence_serialize};
14
14
+
use buttplug_core::{message::InputCommandType, util::range_serialize::{range_serialize, range_sequence_serialize, option_range_serialize}};
15
15
use getset::{CopyGetters, Getters, MutGetters, Setters};
16
16
use serde::{Deserialize, Serialize};
17
17
use uuid::Uuid;
···
31
31
32
32
#[derive(Serialize, Deserialize, Clone, Debug)]
33
33
struct BaseDeviceFeatureOutputValueProperties {
34
34
+
#[serde(serialize_with="range_serialize")]
34
35
value: RangeInclusive<i32>,
35
36
}
36
37
···
42
43
43
44
#[derive(Serialize, Deserialize, Clone, Debug)]
44
45
struct BaseDeviceFeatureOutputPositionProperties {
46
46
+
#[serde(serialize_with="range_serialize")]
45
47
value: RangeInclusive<i32>,
46
48
}
47
49
···
55
57
56
58
#[derive(Serialize, Deserialize, Clone, Debug)]
57
59
struct BaseDeviceFeatureOutputPositionWithDurationProperties {
60
60
+
#[serde(serialize_with="range_serialize")]
58
61
position: RangeInclusive<i32>,
62
62
+
#[serde(serialize_with="range_serialize")]
59
63
duration: RangeInclusive<i32>,
60
64
}
61
65
···
135
139
136
140
#[derive(Serialize, Deserialize, Clone, Debug)]
137
141
struct UserDeviceFeatureOutputValueProperties {
138
138
-
#[serde(skip_serializing_if = "Option::is_none")]
142
142
+
#[serde(skip_serializing_if = "Option::is_none", serialize_with="option_range_serialize")]
139
143
value: Option<RangeInclusive<u32>>,
140
144
#[serde(default)]
141
145
disabled: bool,
···
165
169
166
170
#[derive(Serialize, Deserialize, Clone, Debug)]
167
171
struct UserDeviceFeatureOutputPositionProperties {
168
168
-
#[serde(skip_serializing_if = "Option::is_none")]
172
172
+
#[serde(skip_serializing_if = "Option::is_none", serialize_with="option_range_serialize")]
169
173
value: Option<RangeInclusive<u32>>,
170
174
#[serde(default)]
171
175
disabled: bool,
···
201
205
202
206
#[derive(Serialize, Deserialize, Clone, Debug)]
203
207
struct UserDeviceFeatureOutputPositionWithDurationProperties {
204
204
-
#[serde(skip_serializing_if = "Option::is_none")]
208
208
+
#[serde(skip_serializing_if = "Option::is_none", serialize_with="option_range_serialize")]
205
209
position: Option<RangeInclusive<u32>>,
206
206
-
#[serde(skip_serializing_if = "Option::is_none")]
210
210
+
#[serde(skip_serializing_if = "Option::is_none", serialize_with="option_range_serialize")]
207
211
duration: Option<RangeInclusive<u32>>,
208
212
#[serde(default)]
209
213
disabled: bool,