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 getset::{Getters, Setters};
9use serde::{Deserialize, Serialize};
10
11use crate::message::{v2::ClientDeviceMessageAttributesV2, v3::ClientDeviceMessageAttributesV3};
12use buttplug_core::message::DeviceFeature;
13
14#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
15pub struct NullDeviceMessageAttributesV1 {}
16
17#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Getters, Setters)]
18pub struct ClientDeviceMessageAttributesV1 {
19 // Generic commands
20 #[getset(get = "pub")]
21 #[serde(rename = "VibrateCmd")]
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub(in crate::message) vibrate_cmd: Option<GenericDeviceMessageAttributesV1>,
24 #[getset(get = "pub")]
25 #[serde(rename = "RotateCmd")]
26 #[serde(skip_serializing_if = "Option::is_none")]
27 pub(in crate::message) rotate_cmd: Option<GenericDeviceMessageAttributesV1>,
28 #[getset(get = "pub")]
29 #[serde(rename = "LinearCmd")]
30 #[serde(skip_serializing_if = "Option::is_none")]
31 pub(in crate::message) linear_cmd: Option<GenericDeviceMessageAttributesV1>,
32
33 // StopDeviceCmd always exists
34 #[getset(get = "pub")]
35 pub(in crate::message) stop_device_cmd: NullDeviceMessageAttributesV1,
36
37 // Obsolete commands are only added post-serialization
38 #[getset(get = "pub")]
39 #[serde(skip_serializing_if = "Option::is_none")]
40 pub(in crate::message) single_motor_vibrate_cmd: Option<NullDeviceMessageAttributesV1>,
41 #[getset(get = "pub")]
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub(in crate::message) fleshlight_launch_fw12_cmd: Option<NullDeviceMessageAttributesV1>,
44 #[getset(get = "pub")]
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub(in crate::message) vorze_a10_cyclone_cmd: Option<NullDeviceMessageAttributesV1>,
47}
48
49#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Getters, Setters)]
50pub struct GenericDeviceMessageAttributesV1 {
51 #[serde(rename = "FeatureCount")]
52 feature_count: u32,
53}
54
55impl GenericDeviceMessageAttributesV1 {
56 pub fn new(feature_count: u32) -> Self {
57 Self { feature_count }
58 }
59}
60
61impl From<Vec<DeviceFeature>> for ClientDeviceMessageAttributesV1 {
62 fn from(value: Vec<DeviceFeature>) -> Self {
63 ClientDeviceMessageAttributesV2::from(ClientDeviceMessageAttributesV3::from(value)).into()
64 }
65}