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 std::cmp::Ordering;
9
10use crate::message::v0::{
11 ButtplugClientMessageV0,
12 ButtplugServerMessageV0,
13 FleshlightLaunchFW12CmdV0,
14 ServerInfoV0,
15 SingleMotorVibrateCmdV0,
16 VorzeA10CycloneCmdV0,
17};
18use buttplug_core::{
19 errors::ButtplugMessageError,
20 message::{
21 ButtplugMessage,
22 ButtplugMessageFinalizer,
23 ButtplugMessageValidator,
24 DeviceRemovedV0,
25 ErrorV0,
26 OkV0,
27 PingV0,
28 RequestDeviceListV0,
29 ScanningFinishedV0,
30 StartScanningV0,
31 StopAllDevicesV0,
32 StopDeviceCmdV0,
33 StopScanningV0,
34 },
35};
36use serde::{Deserialize, Serialize};
37
38use super::{
39 DeviceAddedV1,
40 DeviceListV1,
41 LinearCmdV1,
42 RequestServerInfoV1,
43 RotateCmdV1,
44 VibrateCmdV1,
45};
46
47/// Represents all client-to-server messages in v1 of the Buttplug Spec
48#[derive(
49 Debug,
50 Clone,
51 PartialEq,
52 ButtplugMessage,
53 ButtplugMessageValidator,
54 ButtplugMessageFinalizer,
55 FromSpecificButtplugMessage,
56 Serialize,
57 Deserialize,
58)]
59pub enum ButtplugClientMessageV1 {
60 // Handshake and server messages
61 RequestServerInfo(RequestServerInfoV1),
62 Ping(PingV0),
63 // Device enumeration messages
64 StartScanning(StartScanningV0),
65 StopScanning(StopScanningV0),
66 RequestDeviceList(RequestDeviceListV0),
67 // Generic commands
68 StopAllDevices(StopAllDevicesV0),
69 VibrateCmd(VibrateCmdV1),
70 LinearCmd(LinearCmdV1),
71 RotateCmd(RotateCmdV1),
72 StopDeviceCmd(StopDeviceCmdV0),
73 // Deprecated generic commands (not removed until v2)
74 SingleMotorVibrateCmd(SingleMotorVibrateCmdV0),
75 // Deprecated device specific commands (not removed until v2)
76 FleshlightLaunchFW12Cmd(FleshlightLaunchFW12CmdV0),
77 VorzeA10CycloneCmd(VorzeA10CycloneCmdV0),
78}
79
80// No messages were changed or deprecated before v2, so we can convert all v0 messages to v1.
81impl From<ButtplugClientMessageV0> for ButtplugClientMessageV1 {
82 fn from(value: ButtplugClientMessageV0) -> Self {
83 match value {
84 ButtplugClientMessageV0::Ping(m) => ButtplugClientMessageV1::Ping(m),
85 ButtplugClientMessageV0::RequestServerInfo(m) => {
86 ButtplugClientMessageV1::RequestServerInfo(m)
87 }
88 ButtplugClientMessageV0::StartScanning(m) => ButtplugClientMessageV1::StartScanning(m),
89 ButtplugClientMessageV0::StopScanning(m) => ButtplugClientMessageV1::StopScanning(m),
90 ButtplugClientMessageV0::RequestDeviceList(m) => {
91 ButtplugClientMessageV1::RequestDeviceList(m)
92 }
93 ButtplugClientMessageV0::StopAllDevices(m) => ButtplugClientMessageV1::StopAllDevices(m),
94 ButtplugClientMessageV0::StopDeviceCmd(m) => ButtplugClientMessageV1::StopDeviceCmd(m),
95 ButtplugClientMessageV0::FleshlightLaunchFW12Cmd(m) => {
96 ButtplugClientMessageV1::FleshlightLaunchFW12Cmd(m)
97 }
98 ButtplugClientMessageV0::SingleMotorVibrateCmd(m) => {
99 ButtplugClientMessageV1::SingleMotorVibrateCmd(m)
100 }
101 ButtplugClientMessageV0::VorzeA10CycloneCmd(m) => {
102 ButtplugClientMessageV1::VorzeA10CycloneCmd(m)
103 }
104 }
105 }
106}
107
108/// Represents all server-to-client messages in v2 of the Buttplug Spec
109#[derive(
110 Debug,
111 Clone,
112 PartialEq,
113 ButtplugMessage,
114 ButtplugMessageValidator,
115 ButtplugMessageFinalizer,
116 FromSpecificButtplugMessage,
117 Serialize,
118 Deserialize,
119)]
120pub enum ButtplugServerMessageV1 {
121 // Status messages
122 Ok(OkV0),
123 Error(ErrorV0),
124 // Handshake messages
125 ServerInfo(ServerInfoV0),
126 // Device enumeration messages
127 DeviceList(DeviceListV1),
128 DeviceAdded(DeviceAddedV1),
129 DeviceRemoved(DeviceRemovedV0),
130 ScanningFinished(ScanningFinishedV0),
131}
132
133impl From<ButtplugServerMessageV1> for ButtplugServerMessageV0 {
134 fn from(value: ButtplugServerMessageV1) -> Self {
135 match value {
136 ButtplugServerMessageV1::Ok(m) => ButtplugServerMessageV0::Ok(m),
137 ButtplugServerMessageV1::Error(m) => ButtplugServerMessageV0::Error(m),
138 ButtplugServerMessageV1::ServerInfo(m) => ButtplugServerMessageV0::ServerInfo(m),
139 ButtplugServerMessageV1::DeviceRemoved(m) => ButtplugServerMessageV0::DeviceRemoved(m),
140 ButtplugServerMessageV1::ScanningFinished(m) => ButtplugServerMessageV0::ScanningFinished(m),
141 ButtplugServerMessageV1::DeviceAdded(m) => ButtplugServerMessageV0::DeviceAdded(m.into()),
142 ButtplugServerMessageV1::DeviceList(m) => ButtplugServerMessageV0::DeviceList(m.into()),
143 }
144 }
145}
146
147// Leave this in for consistency sake, mostly for implementing backward compat tests
148#[allow(dead_code)]
149#[derive(Copy, Debug, Clone, PartialEq, Eq, Hash, Display, Serialize, Deserialize)]
150pub enum ButtplugDeviceMessageNameV1 {
151 VibrateCmd,
152 LinearCmd,
153 RotateCmd,
154 StopDeviceCmd,
155 // Deprecated generic commands
156 SingleMotorVibrateCmd,
157 // Deprecated device specific commands
158 FleshlightLaunchFW12Cmd,
159 LovenseCmd,
160 KiirooCmd,
161 VorzeA10CycloneCmd,
162}
163
164impl PartialOrd for ButtplugDeviceMessageNameV1 {
165 fn partial_cmp(&self, other: &ButtplugDeviceMessageNameV1) -> Option<Ordering> {
166 Some(self.cmp(other))
167 }
168}
169
170impl Ord for ButtplugDeviceMessageNameV1 {
171 fn cmp(&self, other: &ButtplugDeviceMessageNameV1) -> Ordering {
172 self.to_string().cmp(&other.to_string())
173 }
174}