ble_data_struct/windows/descriptors/windows_characteristic_extended_properties.rs
1//! Characteristic Extended Properties (Attribute Type: 0x2900) module for windows.
2
3#[cfg(target_os = "windows")]
4use windows::Storage::Streams::IBuffer;
5
6#[cfg(target_os = "windows")]
7use crate::{
8 descriptors::characteristic_extended_properties::CharacteristicExtendedProperties,
9 windows::buffer::{i_buffer_to_vec, vec_to_i_buffer},
10};
11
12#[cfg(target_os = "windows")]
13impl TryFrom<IBuffer> for CharacteristicExtendedProperties {
14 type Error = String;
15 /// Create [`CharacteristicExtendedProperties`] from [`IBuffer`].
16 ///
17 /// # Examples
18 ///
19 /// ```
20 /// use windows::Storage::Streams::{DataWriter, IBuffer};
21 ///
22 /// use ble_data_struct::descriptors::characteristic_extended_properties::{
23 /// CharacteristicExtendedProperties, RELIABLE_WRITE, WRITABLE_AUXILIARIES,
24 /// };
25 ///
26 /// let client_characteristic_configuration =
27 /// CharacteristicExtendedProperties::new(RELIABLE_WRITE);
28 /// let data_writer = DataWriter::new().unwrap();
29 /// let ble_packet: Vec<u8> = client_characteristic_configuration.into();
30 /// data_writer.WriteBytes(&ble_packet).unwrap();
31 /// let buffer = data_writer.DetachBuffer().unwrap();
32 ///
33 /// let result = CharacteristicExtendedProperties::try_from(buffer);
34 /// assert!(result.is_ok());
35 /// let value = result.unwrap();
36 /// assert!(value.is_reliable_write());
37 /// ```
38 fn try_from(value: IBuffer) -> Result<Self, String> {
39 let vec = i_buffer_to_vec(value).unwrap();
40 let properties = u16::from_le_bytes(vec.try_into().unwrap());
41 Ok(Self { properties })
42 }
43}
44
45#[cfg(target_os = "windows")]
46impl Into<IBuffer> for CharacteristicExtendedProperties {
47 /// Create [`IBuffer`] from [`CharacteristicExtendedProperties`].
48 ///
49 /// # Examples
50 ///
51 /// ```
52 /// use windows::{
53 /// Storage::Streams::{DataWriter, IBuffer},
54 /// };
55 ///
56 /// use ble_data_struct::{
57 /// descriptors::characteristic_extended_properties::{
58 /// CharacteristicExtendedProperties, RELIABLE_WRITE, WRITABLE_AUXILIARIES,
59 /// },
60 /// windows::buffer::i_buffer_to_vec,
61 /// };
62 ///
63 /// let value = CharacteristicExtendedProperties::new(0);
64 /// let buffer: IBuffer = value.clone().into();
65 /// let vec: Vec<u8> = value.into();
66 /// assert_eq!(vec, i_buffer_to_vec(buffer).unwrap());
67 ///
68 /// let value = CharacteristicExtendedProperties::new(RELIABLE_WRITE);
69 /// let buffer: IBuffer = value.clone().into();
70 /// let vec: Vec<u8> = value.into();
71 /// assert_eq!(vec, i_buffer_to_vec(buffer).unwrap());
72 ///
73 /// let value = CharacteristicExtendedProperties::new(WRITABLE_AUXILIARIES);
74 /// let buffer: IBuffer = value.clone().into();
75 /// let vec: Vec<u8> = value.into();
76 /// assert_eq!(vec, i_buffer_to_vec(buffer).unwrap());
77 /// ```
78 fn into(self) -> IBuffer {
79 let vec: Vec<u8> = self.into();
80 vec_to_i_buffer(&vec).unwrap()
81 }
82}
83
84#[cfg(test)]
85mod tests {
86 use windows::Storage::Streams::{DataWriter, IBuffer};
87
88 use crate::{
89 descriptors::characteristic_extended_properties::{
90 CharacteristicExtendedProperties, RELIABLE_WRITE, WRITABLE_AUXILIARIES,
91 },
92 windows::buffer::i_buffer_to_vec,
93 };
94
95 #[test]
96 fn test_try_from_i_buffer() {
97 let client_characteristic_configuration =
98 CharacteristicExtendedProperties::new(RELIABLE_WRITE);
99 let data_writer = DataWriter::new().unwrap();
100 let ble_packet: Vec<u8> = client_characteristic_configuration.into();
101 data_writer.WriteBytes(&ble_packet).unwrap();
102 let buffer = data_writer.DetachBuffer().unwrap();
103
104 let result = CharacteristicExtendedProperties::try_from(buffer);
105 assert!(result.is_ok());
106 let value = result.unwrap();
107 assert!(value.is_reliable_write());
108 }
109
110 #[test]
111 fn test_into_i_buffer() {
112 let value = CharacteristicExtendedProperties::new(0);
113 let buffer: IBuffer = value.clone().into();
114 let vec: Vec<u8> = value.into();
115 assert_eq!(vec, i_buffer_to_vec(buffer).unwrap());
116
117 let value = CharacteristicExtendedProperties::new(RELIABLE_WRITE);
118 let buffer: IBuffer = value.clone().into();
119 let vec: Vec<u8> = value.into();
120 assert_eq!(vec, i_buffer_to_vec(buffer).unwrap());
121
122 let value = CharacteristicExtendedProperties::new(WRITABLE_AUXILIARIES);
123 let buffer: IBuffer = value.clone().into();
124 let vec: Vec<u8> = value.into();
125 assert_eq!(vec, i_buffer_to_vec(buffer).unwrap());
126 }
127}