ble_data_struct/windows/descriptors/windows_characteristic_user_description.rs
1//! Characteristic User Description (Attribute Type: 0x2901) module for windows.
2//!
3//!
4#[cfg(target_os = "windows")]
5use windows::Storage::Streams::IBuffer;
6
7#[cfg(target_os = "windows")]
8use crate::{
9 descriptors::characteristic_user_description::CharacteristicUserDescription,
10 windows::buffer::{i_buffer_to_vec, vec_to_i_buffer},
11};
12
13#[cfg(target_os = "windows")]
14impl TryFrom<IBuffer> for CharacteristicUserDescription {
15 type Error = String;
16 /// Create [`CharacteristicUserDescription`] from [`IBuffer`].
17 ///
18 /// # Examples
19 ///
20 /// ```
21 /// use windows::Storage::Streams::{DataWriter, IBuffer};
22 ///
23 /// use ble_data_struct::descriptors::characteristic_user_description::CharacteristicUserDescription;
24 ///
25 /// let description = "description".to_string();
26 /// let data_writer = DataWriter::new().unwrap();
27 /// let ble_packet: Vec<u8> = description.to_string().into();
28 /// data_writer.WriteBytes(&ble_packet).unwrap();
29 /// let buffer = data_writer.DetachBuffer().unwrap();
30 ///
31 /// let result = CharacteristicUserDescription::try_from(buffer);
32 /// assert!(result.is_ok());
33 /// let value = result.unwrap();
34 /// assert_eq!(description, value.description);
35 /// ```
36 fn try_from(value: IBuffer) -> Result<Self, String> {
37 let vec = i_buffer_to_vec(value).unwrap();
38 let description = String::from_utf8(vec).unwrap();
39 Ok(Self { description })
40 }
41}
42
43#[cfg(target_os = "windows")]
44impl Into<IBuffer> for CharacteristicUserDescription {
45 /// Create [`IBuffer`] from [`CharacteristicUserDescription`].
46 ///
47 /// # Examples
48 ///
49 /// ```
50 /// use windows::Storage::Streams::{DataWriter, IBuffer};
51 ///
52 /// use ble_data_struct::{
53 /// descriptors::characteristic_user_description::CharacteristicUserDescription,
54 /// windows::buffer::i_buffer_to_vec
55 /// };
56 ///
57 /// let description = "description".to_string();
58 /// let value = CharacteristicUserDescription::new(description.to_string());
59 /// let buffer: IBuffer = value.clone().into();
60 /// let vec: Vec<u8> = value.into();
61 /// assert_eq!(vec, i_buffer_to_vec(buffer).unwrap());
62 /// ```
63 fn into(self) -> IBuffer {
64 let vec: Vec<u8> = self.into();
65 vec_to_i_buffer(&vec).unwrap()
66 }
67}
68
69#[cfg(test)]
70mod tests {
71 use windows::Storage::Streams::{DataWriter, IBuffer};
72
73 use crate::{
74 descriptors::characteristic_user_description::CharacteristicUserDescription,
75 windows::buffer::i_buffer_to_vec,
76 };
77
78 #[test]
79 fn test_try_from_i_buffer() {
80 let description = "description".to_string();
81 let data_writer = DataWriter::new().unwrap();
82 let ble_packet: Vec<u8> = description.to_string().into();
83 data_writer.WriteBytes(&ble_packet).unwrap();
84 let buffer = data_writer.DetachBuffer().unwrap();
85
86 let result = CharacteristicUserDescription::try_from(buffer);
87 assert!(result.is_ok());
88 let value = result.unwrap();
89 assert_eq!(description, value.description);
90 }
91
92 #[test]
93 fn test_into_i_buffer() {
94 let description = "description".to_string();
95 let value = CharacteristicUserDescription::new(description.to_string());
96 let buffer: IBuffer = value.clone().into();
97 let vec: Vec<u8> = value.into();
98 assert_eq!(vec, i_buffer_to_vec(buffer).unwrap());
99 }
100}