Buttplug sex toy control library

chore: Fix serialization of user ranges

+27 -9
+18 -4
crates/buttplug_core/src/util/range_serialize.rs
··· 1 1 use std::ops::RangeInclusive; 2 2 3 - use serde::{Serializer, ser::SerializeSeq}; 3 + use serde::{Serializer, Serialize, ser::SerializeSeq}; 4 4 5 - pub fn range_serialize<S>(range: &RangeInclusive<i32>, serializer: S) -> Result<S::Ok, S::Error> 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 + T: Serialize 9 + { 10 + if let Some(r) = range { 11 + range_serialize(r, serializer) 12 + } else { 13 + core::option::Option::None::<T>.serialize(serializer) 14 + } 15 + } 16 + 17 + pub fn range_serialize<S, T>(range: &RangeInclusive<T>, serializer: S) -> Result<S::Ok, S::Error> 18 + where 19 + S: Serializer, 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 - pub fn range_sequence_serialize<S>( 16 - range_vec: &Vec<RangeInclusive<i32>>, 28 + pub fn range_sequence_serialize<S,T>( 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 + 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 - use buttplug_core::{message::InputCommandType, util::range_serialize::range_sequence_serialize}; 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 + #[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 + #[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 + #[serde(serialize_with="range_serialize")] 58 61 position: RangeInclusive<i32>, 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 - #[serde(skip_serializing_if = "Option::is_none")] 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 - #[serde(skip_serializing_if = "Option::is_none")] 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 - #[serde(skip_serializing_if = "Option::is_none")] 208 + #[serde(skip_serializing_if = "Option::is_none", serialize_with="option_range_serialize")] 205 209 position: Option<RangeInclusive<u32>>, 206 - #[serde(skip_serializing_if = "Option::is_none")] 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,