Coverage for src/bluetooth_sig/gatt/descriptors/characteristic_user_description.py: 100%

19 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2025-10-30 00:10 +0000

1"""Characteristic User Description Descriptor implementation.""" 

2 

3from __future__ import annotations 

4 

5import msgspec 

6 

7from .base import BaseDescriptor 

8 

9 

10class CharacteristicUserDescriptionData(msgspec.Struct, frozen=True, kw_only=True): 

11 """Characteristic User Description descriptor data.""" 

12 

13 description: str 

14 

15 

16class CharacteristicUserDescriptionDescriptor(BaseDescriptor): 

17 """Characteristic User Description Descriptor (0x2901). 

18 

19 Contains a user-readable description of the characteristic. 

20 UTF-8 encoded string describing the characteristic's purpose. 

21 """ 

22 

23 def _has_structured_data(self) -> bool: 

24 return True 

25 

26 def _get_data_format(self) -> str: 

27 return "utf8" 

28 

29 def _parse_descriptor_value(self, data: bytes) -> CharacteristicUserDescriptionData: 

30 """Parse Characteristic User Description value. 

31 

32 Args: 

33 data: Raw UTF-8 bytes 

34 

35 Returns: 

36 CharacteristicUserDescriptionData with the description string 

37 """ 

38 try: 

39 description = data.decode("utf-8") 

40 return CharacteristicUserDescriptionData(description=description) 

41 except UnicodeDecodeError as e: 

42 raise ValueError(f"Invalid UTF-8 data in Characteristic User Description: {e}") from e 

43 

44 def get_description(self, data: bytes) -> str: 

45 """Get the user description string.""" 

46 parsed = self._parse_descriptor_value(data) 

47 return parsed.description