Buttplug sex toy control library
at dev 87 lines 2.9 kB view raw
1// Buttplug Rust Source Code File - See https://buttplug.io for more info. 2// 3// Copyright 2016-2024 Nonpolynomial Labs LLC. All rights reserved. 4// 5// Licensed under the BSD 3-Clause license. See LICENSE file in the project root 6// for full license information. 7 8use crate::message::v2::DeviceMessageInfoV2; 9use buttplug_core::message::{DeviceFeature, DeviceMessageInfoV4}; 10 11use super::*; 12use getset::{CopyGetters, Getters, MutGetters}; 13use serde::{Deserialize, Serialize}; 14 15/// Substructure of device messages, used for attribute information (name, messages supported, etc...) 16#[derive(Clone, Debug, MutGetters, Getters, CopyGetters, Serialize, Deserialize)] 17pub struct DeviceMessageInfoV3 { 18 #[serde(rename = "DeviceIndex")] 19 #[getset(get_copy = "pub")] 20 device_index: u32, 21 #[serde(rename = "DeviceName")] 22 #[getset(get = "pub")] 23 device_name: String, 24 #[serde(rename = "DeviceDisplayName", skip_serializing_if = "Option::is_none")] 25 #[getset(get = "pub")] 26 device_display_name: Option<String>, 27 #[serde(rename = "DeviceMessageTimingGap")] 28 #[getset(get = "pub")] 29 device_message_timing_gap: u32, 30 #[serde(rename = "DeviceMessages")] 31 #[getset(get = "pub", get_mut = "pub(super)")] 32 device_messages: ClientDeviceMessageAttributesV3, 33} 34 35impl DeviceMessageInfoV3 { 36 pub fn new( 37 device_index: u32, 38 device_name: &str, 39 device_display_name: &Option<String>, 40 device_message_timing_gap: u32, 41 device_messages: ClientDeviceMessageAttributesV3, 42 ) -> Self { 43 Self { 44 device_index, 45 device_name: device_name.to_owned(), 46 device_display_name: device_display_name.clone(), 47 device_message_timing_gap, 48 device_messages, 49 } 50 } 51} 52 53impl From<DeviceAddedV3> for DeviceMessageInfoV3 { 54 fn from(device_added: DeviceAddedV3) -> Self { 55 Self { 56 device_index: device_added.device_index(), 57 device_name: device_added.device_name().clone(), 58 device_display_name: device_added.device_display_name().clone(), 59 device_message_timing_gap: device_added.device_message_timing_gap(), 60 device_messages: device_added.device_messages().clone(), 61 } 62 } 63} 64 65impl From<DeviceMessageInfoV3> for DeviceMessageInfoV2 { 66 fn from(device_message_info: DeviceMessageInfoV3) -> Self { 67 // No structural difference, it's all content changes 68 Self { 69 device_index: device_message_info.device_index(), 70 device_name: device_message_info.device_name().clone(), 71 device_messages: device_message_info.device_messages().clone().into(), 72 } 73 } 74} 75 76impl From<DeviceMessageInfoV4> for DeviceMessageInfoV3 { 77 fn from(value: DeviceMessageInfoV4) -> Self { 78 let feature_vec: Vec<DeviceFeature> = value.device_features().values().cloned().collect(); 79 DeviceMessageInfoV3::new( 80 value.device_index(), 81 value.device_name(), 82 value.device_display_name(), 83 value.device_message_timing_gap(), 84 feature_vec.into(), 85 ) 86 } 87}