mod device_added;
mod device_removed;
mod device_list;
mod device_message_info;
mod error;
mod fleshlight_launch_fw12_cmd;
mod kiiroo_cmd;
mod linear_cmd;
mod log;
mod log_level;
mod lovense_cmd;
mod message_attributes;
mod ok;
mod ping;
mod raw_read_cmd;
mod raw_reading;
mod raw_write_cmd;
mod request_device_list;
mod request_log;
mod request_server_info;
mod rotate_cmd;
mod scanning_finished;
mod server_info;
mod single_motor_vibrate_cmd;
mod start_scanning;
mod stop_scanning;
mod stop_all_devices;
mod stop_device_cmd;
mod subscribe_cmd;
mod test;
mod unsubscribe_cmd;
mod vibrate_cmd;
mod vorze_a10_cyclone_cmd;
pub use device_added::{DeviceAdded, DeviceAddedV1, DeviceAddedV0};
pub use device_removed::DeviceRemoved;
pub use device_list::{DeviceList, DeviceListV1, DeviceListV0};
pub use device_message_info::{DeviceMessageInfo, MessageAttributesMap};
pub use error::{Error, ErrorCode};
pub use fleshlight_launch_fw12_cmd::FleshlightLaunchFW12Cmd;
pub use kiiroo_cmd::KiirooCmd;
pub use linear_cmd::{LinearCmd, VectorSubcommand};
pub use self::log::Log;
pub use log_level::LogLevel;
pub use lovense_cmd::LovenseCmd;
pub use message_attributes::MessageAttributes;
pub use ok::Ok;
pub use ping::Ping;
pub use raw_read_cmd::RawReadCmd;
pub use raw_write_cmd::RawWriteCmd;
pub use raw_reading::RawReading;
pub use request_device_list::RequestDeviceList;
pub use request_log::RequestLog;
pub use request_server_info::RequestServerInfo;
pub use rotate_cmd::{RotateCmd, RotationSubcommand};
pub use scanning_finished::ScanningFinished;
pub use server_info::{ServerInfo, ServerInfoV0};
pub use single_motor_vibrate_cmd::SingleMotorVibrateCmd;
pub use start_scanning::StartScanning;
pub use stop_all_devices::StopAllDevices;
pub use stop_device_cmd::StopDeviceCmd;
pub use stop_scanning::StopScanning;
pub use subscribe_cmd::SubscribeCmd;
pub use test::Test;
pub use unsubscribe_cmd::UnsubscribeCmd;
pub use vibrate_cmd::{VibrateCmd, VibrateSubcommand};
pub use vorze_a10_cyclone_cmd::VorzeA10CycloneCmd;
use crate::{
core::errors::ButtplugMessageError,
util::json::JSONValidator
};
use std::convert::TryFrom;
#[cfg(feature = "serialize_json")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "serialize_json")]
use serde_repr::{Deserialize_repr, Serialize_repr};
static MESSAGE_JSON_SCHEMA: &str =
include_str!("../../../dependencies/buttplug-schema/schema/buttplug-schema.json");
pub fn create_message_validator() -> JSONValidator {
JSONValidator::new(MESSAGE_JSON_SCHEMA)
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Display)]
#[repr(u32)]
#[cfg_attr(feature = "serialize_json", derive(Serialize_repr, Deserialize_repr))]
pub enum ButtplugMessageSpecVersion {
Version0 = 0,
Version1 = 1,
Version2 = 2,
}
pub const BUTTPLUG_CURRENT_MESSAGE_SPEC_VERSION: ButtplugMessageSpecVersion = ButtplugMessageSpecVersion::Version2;
pub trait ButtplugMessage: Send + Sync + Clone {
fn get_id(&self) -> u32;
fn set_id(&mut self, id: u32);
#[cfg(feature = "serialize_json")]
fn as_protocol_json(self) -> String
where
Self: ButtplugMessage + Serialize + Deserialize<'static>,
{
serde_json::to_string(&[&self]).unwrap()
}
}
pub trait ButtplugDeviceMessage: ButtplugMessage {
fn get_device_index(&self) -> u32;
fn set_device_index(&mut self, id: u32);
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serialize_json", derive(Serialize, Deserialize))]
pub enum ButtplugMessageType {
Ok,
Error,
Ping,
Test,
RequestLog,
Log,
RequestServerInfo,
ServerInfo,
DeviceList,
DeviceAdded,
DeviceRemoved,
StartScanning,
StopScanning,
ScanningFinished,
RequestDeviceList,
StopAllDevices,
VibrateCmd,
LinearCmd,
RotateCmd,
RawWriteCmd,
RawReadCmd,
StopDeviceCmd,
RawReading,
SubscribeCmd,
UnsubscribeCmd,
BatteryLevelCmd,
RSSILevelCmd,
SingleMotorVibrateCmd,
FleshlightLaunchFW12Cmd,
LovenseCmd,
KiirooCmd,
VorzeA10CycloneCmd,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serialize_json", derive(Serialize, Deserialize))]
pub enum ButtplugDeviceMessageType {
VibrateCmd,
LinearCmd,
RotateCmd,
RawWriteCmd,
RawReadCmd,
StopDeviceCmd,
SubscribeCmd,
UnsubscribeCmd,
SingleMotorVibrateCmd,
FleshlightLaunchFW12Cmd,
LovenseCmd,
KiirooCmd,
VorzeA10CycloneCmd,
BatteryLevelCmd,
RSSILevelCmd,
}
#[derive(Debug, Clone, PartialEq, ButtplugMessage, FromSpecificButtplugMessage)]
#[cfg_attr(feature = "serialize_json", derive(Serialize, Deserialize))]
pub enum ButtplugInMessage {
Ping(Ping),
RequestLog(RequestLog),
RequestServerInfo(RequestServerInfo),
StartScanning(StartScanning),
StopScanning(StopScanning),
RequestDeviceList(RequestDeviceList),
StopAllDevices(StopAllDevices),
VibrateCmd(VibrateCmd),
LinearCmd(LinearCmd),
RotateCmd(RotateCmd),
RawWriteCmd(RawWriteCmd),
RawReadCmd(RawReadCmd),
StopDeviceCmd(StopDeviceCmd),
SubscribeCmd(SubscribeCmd),
UnsubscribeCmd(UnsubscribeCmd),
SingleMotorVibrateCmd(SingleMotorVibrateCmd),
FleshlightLaunchFW12Cmd(FleshlightLaunchFW12Cmd),
LovenseCmd(LovenseCmd),
KiirooCmd(KiirooCmd),
VorzeA10CycloneCmd(VorzeA10CycloneCmd),
}
#[derive(Debug, Clone, PartialEq, ButtplugMessage, FromSpecificButtplugMessage)]
#[cfg_attr(feature = "serialize_json", derive(Serialize, Deserialize))]
pub enum ButtplugOutMessage {
Ok(Ok),
Error(Error),
Test(Test),
Log(Log),
ServerInfo(ServerInfo),
DeviceList(DeviceList),
DeviceAdded(DeviceAdded),
DeviceRemoved(DeviceRemoved),
ScanningFinished(ScanningFinished),
RawReading(RawReading),
}
pub type ButtplugClientInMessage = ButtplugSpecV2InMessage;
pub type ButtplugClientOutMessage = ButtplugSpecV2OutMessage;
#[derive(Debug, Clone, PartialEq, ButtplugMessage, FromSpecificButtplugMessage, TryFromButtplugInMessage)]
#[cfg_attr(feature = "serialize_json", derive(Serialize, Deserialize))]
pub enum ButtplugSpecV2InMessage {
RequestLog(RequestLog),
RequestServerInfo(RequestServerInfo),
StartScanning(StartScanning),
StopScanning(StopScanning),
RequestDeviceList(RequestDeviceList),
StopAllDevices(StopAllDevices),
VibrateCmd(VibrateCmd),
LinearCmd(LinearCmd),
RotateCmd(RotateCmd),
RawWriteCmd(RawWriteCmd),
RawReadCmd(RawReadCmd),
StopDeviceCmd(StopDeviceCmd),
SubscribeCmd(SubscribeCmd),
UnsubscribeCmd(UnsubscribeCmd),
}
#[derive(Debug, Clone, PartialEq, ButtplugMessage, FromSpecificButtplugMessage, TryFromButtplugOutMessage)]
#[cfg_attr(feature = "serialize_json", derive(Serialize, Deserialize))]
pub enum ButtplugSpecV2OutMessage {
Ok(Ok),
Error(Error),
Log(Log),
ServerInfo(ServerInfo),
DeviceList(DeviceList),
DeviceAdded(DeviceAdded),
DeviceRemoved(DeviceRemoved),
ScanningFinished(ScanningFinished),
RawReading(RawReading),
}
#[derive(Debug, Clone, PartialEq, ButtplugMessage, TryFromButtplugInMessage)]
#[cfg_attr(feature = "serialize_json", derive(Serialize, Deserialize))]
pub(crate) enum ButtplugSpecV1InMessage {
RequestLog(RequestLog),
RequestServerInfo(RequestServerInfo),
StartScanning(StartScanning),
StopScanning(StopScanning),
RequestDeviceList(RequestDeviceList),
StopAllDevices(StopAllDevices),
VibrateCmd(VibrateCmd),
LinearCmd(LinearCmd),
RotateCmd(RotateCmd),
StopDeviceCmd(StopDeviceCmd),
SingleMotorVibrateCmd(SingleMotorVibrateCmd),
FleshlightLaunchFW12Cmd(FleshlightLaunchFW12Cmd),
LovenseCmd(LovenseCmd),
KiirooCmd(KiirooCmd),
VorzeA10CycloneCmd(VorzeA10CycloneCmd),
}
#[derive(Debug, Clone, PartialEq, ButtplugMessage)]
#[cfg_attr(feature = "serialize_json", derive(Serialize, Deserialize))]
pub(crate) enum ButtplugSpecV1OutMessage {
Ok(Ok),
Error(Error),
Log(Log),
ServerInfo(ServerInfoV0),
DeviceList(DeviceListV1),
DeviceAdded(DeviceAddedV1),
DeviceRemoved(DeviceRemoved),
ScanningFinished(ScanningFinished),
}
impl TryFrom<ButtplugOutMessage> for ButtplugSpecV1OutMessage {
type Error = ButtplugMessageError;
fn try_from(msg: ButtplugOutMessage)
-> Result<Self, ButtplugMessageError> {
match msg {
ButtplugOutMessage::Ok(msg) =>
Ok(ButtplugSpecV1OutMessage::Ok(msg.into())),
ButtplugOutMessage::Error(msg) =>
Ok(ButtplugSpecV1OutMessage::Error(msg.into())),
ButtplugOutMessage::Log(msg) =>
Ok(ButtplugSpecV1OutMessage::Log(msg.into())),
ButtplugOutMessage::ServerInfo(msg) =>
Ok(ButtplugSpecV1OutMessage::ServerInfo(msg.into())),
ButtplugOutMessage::DeviceList(msg) =>
Ok(ButtplugSpecV1OutMessage::DeviceList(msg.into())),
ButtplugOutMessage::DeviceAdded(msg) =>
Ok(ButtplugSpecV1OutMessage::DeviceAdded(msg.into())),
ButtplugOutMessage::DeviceRemoved(msg) =>
Ok(ButtplugSpecV1OutMessage::DeviceRemoved(msg.into())),
ButtplugOutMessage::ScanningFinished(msg) =>
Ok(ButtplugSpecV1OutMessage::ScanningFinished(msg.into())),
_ =>
Err(ButtplugMessageError::new("ButtplugOutMessage cannot be converted to #name")),
}
}
}
#[derive(Debug, Clone, PartialEq, ButtplugMessage, TryFromButtplugInMessage)]
#[cfg_attr(feature = "serialize_json", derive(Serialize, Deserialize))]
pub(crate) enum ButtplugSpecV0InMessage {
RequestLog(RequestLog),
RequestServerInfo(RequestServerInfo),
StartScanning(StartScanning),
StopScanning(StopScanning),
RequestDeviceList(RequestDeviceList),
StopAllDevices(StopAllDevices),
StopDeviceCmd(StopDeviceCmd),
SingleMotorVibrateCmd(SingleMotorVibrateCmd),
FleshlightLaunchFW12Cmd(FleshlightLaunchFW12Cmd),
LovenseCmd(LovenseCmd),
KiirooCmd(KiirooCmd),
VorzeA10CycloneCmd(VorzeA10CycloneCmd),
}
#[derive(Debug, Clone, PartialEq, ButtplugMessage)]
#[cfg_attr(feature = "serialize_json", derive(Serialize, Deserialize))]
pub(crate) enum ButtplugSpecV0OutMessage {
Ok(Ok),
Error(Error),
Log(Log),
ServerInfo(ServerInfoV0),
DeviceList(DeviceListV0),
DeviceAdded(DeviceAddedV0),
DeviceRemoved(DeviceRemoved),
ScanningFinished(ScanningFinished),
}
impl TryFrom<ButtplugOutMessage> for ButtplugSpecV0OutMessage {
type Error = ButtplugMessageError;
fn try_from(msg: ButtplugOutMessage)
-> Result<Self, ButtplugMessageError> {
match msg {
ButtplugOutMessage::Ok(msg) =>
Ok(ButtplugSpecV0OutMessage::Ok(msg.into())),
ButtplugOutMessage::Error(msg) =>
Ok(ButtplugSpecV0OutMessage::Error(msg.into())),
ButtplugOutMessage::Log(msg) =>
Ok(ButtplugSpecV0OutMessage::Log(msg.into())),
ButtplugOutMessage::ServerInfo(msg) =>
Ok(ButtplugSpecV0OutMessage::ServerInfo(msg.into())),
ButtplugOutMessage::DeviceList(msg) =>
Ok(ButtplugSpecV0OutMessage::DeviceList(msg.into())),
ButtplugOutMessage::DeviceAdded(msg) =>
Ok(ButtplugSpecV0OutMessage::DeviceAdded(msg.into())),
ButtplugOutMessage::DeviceRemoved(msg) =>
Ok(ButtplugSpecV0OutMessage::DeviceRemoved(msg.into())),
ButtplugOutMessage::ScanningFinished(msg) =>
Ok(ButtplugSpecV0OutMessage::ScanningFinished(msg.into())),
_ =>
Err(ButtplugMessageError::new("ButtplugOutMessage cannot be converted to ButtplugSepcV0OutMessage")),
}
}
}
#[derive(
Debug,
Clone,
PartialEq,
ButtplugMessage,
FromSpecificButtplugMessage,
TryFromButtplugInMessage,
)]
pub enum ButtplugDeviceManagerMessageUnion {
RequestDeviceList(RequestDeviceList),
StopAllDevices(StopAllDevices),
StartScanning(StartScanning),
StopScanning(StopScanning),
}
#[derive(
Debug,
Clone,
PartialEq,
ButtplugDeviceMessage,
FromSpecificButtplugMessage,
TryFromButtplugInMessage,
)]
pub enum ButtplugDeviceCommandMessageUnion {
FleshlightLaunchFW12Cmd(FleshlightLaunchFW12Cmd),
SingleMotorVibrateCmd(SingleMotorVibrateCmd),
VorzeA10CycloneCmd(VorzeA10CycloneCmd),
KiirooCmd(KiirooCmd),
VibrateCmd(VibrateCmd),
LinearCmd(LinearCmd),
RotateCmd(RotateCmd),
RawWriteCmd(RawWriteCmd),
RawReadCmd(RawReadCmd),
StopDeviceCmd(StopDeviceCmd),
SubscribeCmd(SubscribeCmd),
UnsubscribeCmd(UnsubscribeCmd),
}