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}