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 OutputType,
16 },
17};
18use getset::{CopyGetters, Getters};
19use serde::{Deserialize, Serialize};
20
21/// Generic command for setting a level (single magnitude value) of a device feature.
22#[derive(Debug, PartialEq, Clone, CopyGetters, Serialize, Deserialize)]
23#[getset(get_copy = "pub")]
24pub struct ScalarSubcommandV3 {
25 #[serde(rename = "Index")]
26 index: u32,
27 #[serde(rename = "Scalar")]
28 scalar: f64,
29 #[serde(rename = "ActuatorType")]
30 actuator_type: OutputType,
31}
32
33impl ScalarSubcommandV3 {
34 pub fn new(index: u32, scalar: f64, actuator_type: OutputType) -> Self {
35 Self {
36 index,
37 scalar,
38 actuator_type,
39 }
40 }
41}
42
43#[derive(
44 Debug,
45 Default,
46 ButtplugDeviceMessage,
47 ButtplugMessageFinalizer,
48 PartialEq,
49 Clone,
50 Getters,
51 Serialize,
52 Deserialize,
53)]
54pub struct ScalarCmdV3 {
55 #[serde(rename = "Id")]
56 id: u32,
57 #[serde(rename = "DeviceIndex")]
58 device_index: u32,
59 #[serde(rename = "Scalars")]
60 #[getset(get = "pub")]
61 scalars: Vec<ScalarSubcommandV3>,
62}
63
64impl ScalarCmdV3 {
65 pub fn new(device_index: u32, scalars: Vec<ScalarSubcommandV3>) -> Self {
66 Self {
67 id: 1,
68 device_index,
69 scalars,
70 }
71 }
72}
73
74impl ButtplugMessageValidator for ScalarCmdV3 {
75 fn is_valid(&self) -> Result<(), ButtplugMessageError> {
76 self.is_not_system_id(self.id)?;
77 for level in &self.scalars {
78 self.is_in_command_range(
79 level.scalar,
80 format!(
81 "Level {} for ScalarCmd index {} is invalid. Level should be a value between 0.0 and 1.0",
82 level.scalar, level.index
83 ),
84 )?;
85 }
86 Ok(())
87 }
88}