ble_data_struct/descriptors/characteristic_user_description.rs
1//! Characteristic User Description (Attribute Type: 0x2901) module.
2
3use crate::Uuid16bit;
4
5/// Characteristic User Description.
6#[derive(Debug, PartialEq, Clone)]
7pub struct CharacteristicUserDescription {
8 /// Characteristic User Description
9 pub description: String,
10}
11
12impl CharacteristicUserDescription {
13 /// Create [`CharacteristicUserDescription`] from [`String`].
14 ///
15 /// # Examples
16 ///
17 /// ```
18 /// use ble_data_struct::{
19 /// descriptors::characteristic_user_description::CharacteristicUserDescription, Uuid16bit,
20 /// };
21 ///
22 /// let description = "description".to_string();
23 /// let result = CharacteristicUserDescription::new(description.to_string());
24 /// assert_eq!(description, result.description);
25 /// ```
26 pub fn new(description: String) -> Self {
27 Self { description }
28 }
29}
30
31impl TryFrom<&Vec<u8>> for CharacteristicUserDescription {
32 type Error = String;
33 /// Create [`CharacteristicUserDescription`] from [`Vec<u8>`].
34 ///
35 /// # Examples
36 ///
37 /// ```
38 /// use ble_data_struct::{
39 /// descriptors::characteristic_user_description::CharacteristicUserDescription, Uuid16bit,
40 /// };
41 ///
42 /// let description = "description".to_string();
43 /// let result = CharacteristicUserDescription::try_from(&description.to_string().into_bytes());
44 /// assert!(result.is_ok());
45 /// assert_eq!(description, result.unwrap().description);
46 /// ```
47 fn try_from(value: &Vec<u8>) -> Result<Self, String> {
48 Ok(Self {
49 description: String::from_utf8(value.to_vec()).unwrap(),
50 })
51 }
52}
53
54impl Into<Vec<u8>> for CharacteristicUserDescription {
55 /// Create [`Vec<u8>`] from [`CharacteristicUserDescription`].
56 ///
57 /// # Examples
58 ///
59 /// ```
60 /// use ble_data_struct::{
61 /// descriptors::characteristic_user_description::CharacteristicUserDescription, Uuid16bit,
62 /// };
63 ///
64 /// let description = "description".to_string();
65 /// let result = CharacteristicUserDescription::new(description.to_string());
66 /// let into_data: Vec<u8> = result.into();
67 /// assert_eq!(description.to_string().into_bytes(), into_data);
68 /// ```
69 fn into(self) -> Vec<u8> {
70 self.description.clone().into_bytes()
71 }
72}
73
74impl Uuid16bit for CharacteristicUserDescription {
75 /// return `0x2901`.
76 ///
77 /// # Examples
78 ///
79 /// ```
80 /// use ble_data_struct::{
81 /// descriptors::characteristic_user_description::CharacteristicUserDescription, Uuid16bit,
82 /// };
83 ///
84 /// assert_eq!(0x2901, CharacteristicUserDescription::uuid_16bit());
85 /// ```
86 fn uuid_16bit() -> u16 {
87 0x2901
88 }
89}
90
91#[cfg(test)]
92mod tests {
93 use crate::{
94 descriptors::characteristic_user_description::CharacteristicUserDescription, Uuid16bit,
95 };
96
97 #[test]
98 fn test_new() {
99 let description = "description".to_string();
100 let result = CharacteristicUserDescription::new(description.to_string());
101 assert_eq!(description, result.description);
102 }
103
104 #[test]
105 fn test_try_from() {
106 let description = "description".to_string();
107 let result = CharacteristicUserDescription::try_from(&description.to_string().into_bytes());
108 assert!(result.is_ok());
109 assert_eq!(description, result.unwrap().description);
110 }
111
112 #[test]
113 fn test_into() {
114 let description = "description".to_string();
115 let result = CharacteristicUserDescription::new(description.to_string());
116 let into_data: Vec<u8> = result.into();
117 assert_eq!(description.to_string().into_bytes(), into_data);
118 }
119
120 #[test]
121 fn test_uuid_16bit() {
122 assert_eq!(0x2901, CharacteristicUserDescription::uuid_16bit());
123 }
124}