Coverage for src / bluetooth_sig / types / context.py: 100%

19 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-18 11:17 +0000

1"""Context objects used during characteristic parsing.""" 

2 

3from __future__ import annotations 

4 

5from collections.abc import Mapping 

6from typing import Any 

7 

8import msgspec 

9 

10from .company import ManufacturerData 

11from .registry.descriptor_types import DescriptorData 

12from .uuid import BluetoothUUID 

13 

14 

15class DeviceInfo(msgspec.Struct, kw_only=True): 

16 """Basic device metadata available to parsers.""" 

17 

18 address: str = "" 

19 name: str = "" 

20 manufacturer_data: dict[int, ManufacturerData] = msgspec.field(default_factory=dict) 

21 service_uuids: list[BluetoothUUID] = msgspec.field(default_factory=list) 

22 

23 

24class CharacteristicContext(msgspec.Struct, kw_only=True): 

25 """Runtime context passed into parsers - INPUT only. 

26 

27 This provides the parsing context (device info, other characteristics for 

28 dependencies, etc.) but does NOT contain output fields. Descriptors have 

29 their own separate parsing flow. 

30 

31 Attributes: 

32 device_info: Basic device metadata (address, name, manufacturer data). 

33 advertisement: Raw advertisement bytes if available. 

34 other_characteristics: Mapping from characteristic UUID string to 

35 previously-parsed characteristic result. Parsers may consult this 

36 mapping to implement multi-characteristic decoding. 

37 descriptors: Mapping from descriptor UUID string to parsed descriptor data. 

38 Provides access to characteristic descriptors during parsing. 

39 raw_service: Optional raw service-level payload when applicable. 

40 validate: Whether to perform validation during parsing (range checks, etc.). 

41 

42 """ 

43 

44 device_info: DeviceInfo | None = None 

45 advertisement: bytes = b"" 

46 other_characteristics: Mapping[str, Any] | None = None 

47 descriptors: Mapping[str, DescriptorData] | None = None 

48 raw_service: bytes = b"" 

49 validate: bool = True