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 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}