use super::*;
use crate::core::errors::*;
#[cfg(feature = "serialize_json")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "serialize_json")]
use serde_repr::{Deserialize_repr, Serialize_repr};
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serialize_json", derive(Serialize_repr, Deserialize_repr))]
#[repr(u8)]
pub enum ErrorCode {
ErrorUnknown = 0,
ErrorHandshake,
ErrorPing,
ErrorMessage,
ErrorDevice,
}
#[derive(
Debug,
Clone,
PartialEq,
ButtplugMessage,
)]
#[cfg_attr(feature = "serialize_json", derive(Serialize, Deserialize))]
pub struct Error {
#[cfg_attr(feature = "serialize_json", serde(rename = "Id"))]
pub(super) id: u32,
#[cfg_attr(feature = "serialize_json", serde(rename = "ErrorCode"))]
pub error_code: ErrorCode,
#[cfg_attr(feature = "serialize_json", serde(rename = "ErrorMessage"))]
pub error_message: String,
}
impl Error {
pub fn new(error_code: ErrorCode, error_message: &str) -> Self {
Self {
id: 0,
error_code,
error_message: error_message.to_string(),
}
}
}
impl From<ButtplugError> for Error {
fn from(error: ButtplugError) -> Self {
let code = match error {
ButtplugError::ButtplugDeviceError(_) => ErrorCode::ErrorDevice,
ButtplugError::ButtplugMessageError(_) => ErrorCode::ErrorMessage,
ButtplugError::ButtplugPingError(_) => ErrorCode::ErrorPing,
ButtplugError::ButtplugHandshakeError(_) => ErrorCode::ErrorHandshake,
ButtplugError::ButtplugUnknownError(_) => ErrorCode::ErrorUnknown,
};
let msg = match error {
ButtplugError::ButtplugDeviceError(_s) => _s.message,
ButtplugError::ButtplugMessageError(_s) => _s.message,
ButtplugError::ButtplugPingError(_s) => _s.message,
ButtplugError::ButtplugHandshakeError(_s) => _s.message,
ButtplugError::ButtplugUnknownError(_s) => _s.message,
};
Error::new(code, &msg)
}
}
#[cfg(feature = "serialize_json")]
#[cfg(test)]
mod test {
use crate::core::messages::{ButtplugClientOutMessage, Error, ErrorCode};
const ERROR_STR: &str =
"{\"Error\":{\"Id\":0,\"ErrorCode\":1,\"ErrorMessage\":\"Test Error\"}}";
#[test]
fn test_error_serialize() {
let error =
ButtplugClientOutMessage::Error(Error::new(ErrorCode::ErrorHandshake, "Test Error"));
let js = serde_json::to_string(&error).unwrap();
assert_eq!(ERROR_STR, js);
}
#[test]
fn test_error_deserialize() {
let union: ButtplugClientOutMessage = serde_json::from_str(&ERROR_STR).unwrap();
assert_eq!(
ButtplugClientOutMessage::Error(Error::new(ErrorCode::ErrorHandshake, "Test Error")),
union
);
}
}