Buttplug sex toy control library
at dev 2.8 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 ButtplugMessage, 12 ButtplugMessageFinalizer, 13 ButtplugMessageSpecVersion, 14 ButtplugMessageValidator, 15 }, 16}; 17use getset::{CopyGetters, Getters}; 18use serde::{Deserialize, Serialize}; 19 20fn return_version0() -> ButtplugMessageSpecVersion { 21 ButtplugMessageSpecVersion::Version0 22} 23 24// For RequestServerInfo, serde will take care of invalid message versions from json, and internal 25// representations of versions require using the version enum as a type bound. Therefore we do not 26// need explicit content checking for the message. 27#[derive( 28 Debug, 29 ButtplugMessage, 30 ButtplugMessageFinalizer, 31 Clone, 32 PartialEq, 33 Eq, 34 Getters, 35 CopyGetters, 36 Serialize, 37 Deserialize, 38)] 39pub struct RequestServerInfoV1 { 40 #[serde(rename = "Id")] 41 id: u32, 42 #[serde(rename = "ClientName")] 43 #[getset(get = "pub")] 44 client_name: String, 45 // Default for this message is set to 0, as this field didn't exist in the 46 // first version of the protocol. 47 #[serde(rename = "MessageVersion", default = "return_version0")] 48 #[getset(get_copy = "pub")] 49 message_version: ButtplugMessageSpecVersion, 50} 51 52impl RequestServerInfoV1 { 53 pub fn new(client_name: &str, message_version: ButtplugMessageSpecVersion) -> Self { 54 Self { 55 id: 1, 56 client_name: client_name.to_string(), 57 message_version, 58 } 59 } 60} 61 62impl ButtplugMessageValidator for RequestServerInfoV1 { 63 fn is_valid(&self) -> Result<(), ButtplugMessageError> { 64 self.is_not_system_id(self.id) 65 } 66} 67 68#[cfg(test)] 69mod test { 70 use super::{ButtplugMessageSpecVersion, RequestServerInfoV1}; 71 72 #[test] 73 fn test_request_server_info_version1_json_conversion() { 74 let new_json = r#" 75{ 76 "Id": 1, 77 "ClientName": "Test Client", 78 "MessageVersion": 2 79} 80 "#; 81 let new_msg = RequestServerInfoV1 { 82 id: 1, 83 client_name: "Test Client".to_owned(), 84 message_version: ButtplugMessageSpecVersion::Version2, 85 }; 86 assert_eq!( 87 serde_json::from_str::<RequestServerInfoV1>(new_json).expect("Test unwrap"), 88 new_msg 89 ); 90 } 91 92 #[test] 93 fn test_request_server_info_version0_json_conversion() { 94 let old_json = r#" 95{ 96 "Id": 1, 97 "ClientName": "Test Client" 98} 99 "#; 100 let old_msg = RequestServerInfoV1 { 101 id: 1, 102 client_name: "Test Client".to_owned(), 103 message_version: ButtplugMessageSpecVersion::Version0, 104 }; 105 assert_eq!( 106 serde_json::from_str::<RequestServerInfoV1>(old_json).expect("Test unwrap"), 107 old_msg 108 ); 109 } 110}