Buttplug sex toy control library

chore: Require BTreeMaps for client feature creation

+6 -6
+2 -3
crates/buttplug_core/src/message/v4/device_message_info.rs
··· 37 37 device_name: &str, 38 38 device_display_name: &Option<String>, 39 39 device_message_timing_gap: u32, 40 - device_features: &Vec<DeviceFeature>, 40 + device_features: &BTreeMap<u32, DeviceFeature>, 41 41 ) -> Self { 42 - let feature_map = device_features.iter().map(|x| (x.feature_index(), x.clone())).collect(); 43 42 Self { 44 43 device_index, 45 44 device_name: device_name.to_owned(), 46 45 device_display_name: device_display_name.clone(), 47 46 device_message_timing_gap, 48 - device_features: feature_map, 47 + device_features: device_features.clone(), 49 48 } 50 49 } 51 50 }
+4 -3
crates/buttplug_server/src/device/server_device.rs
··· 37 37 //! In order to handle multiple message spec versions 38 38 39 39 use std::{ 40 - collections::VecDeque, 40 + collections::{BTreeMap, VecDeque}, 41 41 fmt::{self, Debug}, 42 42 sync::Arc, 43 43 time::Duration, ··· 529 529 .features() 530 530 .iter() 531 531 .enumerate() 532 - .map(|(i, x)| x.as_device_feature(i as u32)) 533 - .collect::<Vec<DeviceFeature>>(), 532 + .map(|(i, x)| (i as u32, x.as_device_feature(i as u32))) 533 + .filter(|(_, x)| x.output().as_ref().is_some_and(|x| x.len() > 0) || x.input().as_ref().is_some_and(|x| x.len() > 0)) 534 + .collect::<BTreeMap<u32, DeviceFeature>>(), 534 535 ) 535 536 } 536 537