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 buttplug_core::{
9 errors::ButtplugMessageError,
10 message::{
11 ButtplugDeviceMessage,
12 ButtplugMessage,
13 ButtplugMessageFinalizer,
14 ButtplugMessageValidator,
15 },
16};
17use getset::{CopyGetters, Getters};
18use serde::{Deserialize, Serialize};
19
20#[derive(Debug, Default, PartialEq, Clone, CopyGetters, Serialize, Deserialize)]
21#[getset(get_copy = "pub")]
22pub struct VibrateSubcommandV1 {
23 #[serde(rename = "Index")]
24 index: u32,
25 #[serde(rename = "Speed")]
26 speed: f64,
27}
28
29impl VibrateSubcommandV1 {
30 pub fn new(index: u32, speed: f64) -> Self {
31 Self { index, speed }
32 }
33}
34
35#[derive(
36 Debug,
37 Default,
38 ButtplugDeviceMessage,
39 ButtplugMessageFinalizer,
40 PartialEq,
41 Clone,
42 Getters,
43 Serialize,
44 Deserialize,
45)]
46pub struct VibrateCmdV1 {
47 #[serde(rename = "Id")]
48 id: u32,
49 #[serde(rename = "DeviceIndex")]
50 device_index: u32,
51 #[serde(rename = "Speeds")]
52 #[getset(get = "pub")]
53 speeds: Vec<VibrateSubcommandV1>,
54}
55
56impl VibrateCmdV1 {
57 pub fn new(device_index: u32, speeds: Vec<VibrateSubcommandV1>) -> Self {
58 Self {
59 id: 1,
60 device_index,
61 speeds,
62 }
63 }
64}
65
66impl ButtplugMessageValidator for VibrateCmdV1 {
67 fn is_valid(&self) -> Result<(), ButtplugMessageError> {
68 self.is_not_system_id(self.id)?;
69 for speed in &self.speeds {
70 self.is_in_command_range(speed.speed, format!("Speed {} for VibrateCmd index {} is invalid. Speed should be a value between 0.0 and 1.0", speed.speed, speed.index))?;
71 }
72 Ok(())
73 }
74}