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}