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
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-18 11:17 +0000
1"""Context objects used during characteristic parsing."""
3from __future__ import annotations
5from collections.abc import Mapping
6from typing import Any
8import msgspec
10from .company import ManufacturerData
11from .registry.descriptor_types import DescriptorData
12from .uuid import BluetoothUUID
15class DeviceInfo(msgspec.Struct, kw_only=True):
16 """Basic device metadata available to parsers."""
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)
24class CharacteristicContext(msgspec.Struct, kw_only=True):
25 """Runtime context passed into parsers - INPUT only.
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.
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.).
42 """
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