Buttplug sex toy control library
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}