Buttplug sex toy control library
at master 174 lines 5.4 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 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}