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