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

17 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-01-11 20:14 +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 .registry.descriptor_types import DescriptorData 

11from .uuid import BluetoothUUID 

12 

13 

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

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

16 

17 address: str = "" 

18 name: str = "" 

19 manufacturer_data: dict[int, bytes] = msgspec.field(default_factory=dict) 

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

21 

22 

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

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

25 

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

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

28 their own separate parsing flow. 

29 

30 Attributes: 

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

32 advertisement: Raw advertisement bytes if available. 

33 other_characteristics: Mapping from characteristic UUID string to 

34 previously-parsed characteristic result. Parsers may consult this 

35 mapping to implement multi-characteristic decoding. 

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

37 Provides access to characteristic descriptors during parsing. 

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

39 

40 """ 

41 

42 device_info: DeviceInfo | None = None 

43 advertisement: bytes = b"" 

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

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

46 raw_service: bytes = b""