diff options
Diffstat (limited to 'pw_log_tokenized/py/pw_log_tokenized/__init__.py')
-rw-r--r-- | pw_log_tokenized/py/pw_log_tokenized/__init__.py | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/pw_log_tokenized/py/pw_log_tokenized/__init__.py b/pw_log_tokenized/py/pw_log_tokenized/__init__.py index d0cc1d14f..9fff100cc 100644 --- a/pw_log_tokenized/py/pw_log_tokenized/__init__.py +++ b/pw_log_tokenized/py/pw_log_tokenized/__init__.py @@ -13,9 +13,9 @@ # the License. """Tools for working with tokenized logs.""" -from dataclasses import dataclass +from dataclasses import dataclass, asdict import re -from typing import Dict, Mapping +from typing import Dict, Mapping, Iterator def _mask(value: int, start: int, count: int) -> int: @@ -23,33 +23,38 @@ def _mask(value: int, start: int, count: int) -> int: return (value & (mask << start)) >> start +@dataclass class Metadata: """Parses the metadata payload used by pw_log_tokenized.""" - def __init__(self, - value: int, - *, - log_bits: int = 3, - line_bits: int = 11, - flag_bits: int = 2, - module_bits: int = 16) -> None: - self.value = value - - self.log_level = _mask(value, 0, log_bits) - self.line = _mask(value, log_bits, line_bits) - self.flags = _mask(value, log_bits + line_bits, flag_bits) - self.module_token = _mask(value, log_bits + line_bits + flag_bits, - module_bits) - def __repr__(self) -> str: - return (f'{type(self).__name__}(' - f'log_level={self.log_level}, ' - f'line={self.line}, ' - f'flags={self.flags}, ' - f'module_token={self.module_token})') + value: int + log_bits: int = 3 + line_bits: int = 11 + flag_bits: int = 2 + module_bits: int = 16 + + def __post_init__(self): + self.log_level = _mask(self.value, 0, self.log_bits) + self.line = _mask(self.value, self.log_bits, self.line_bits) + self.flags = _mask( + self.value, self.log_bits + self.line_bits, self.flag_bits + ) + self.module_token = _mask( + self.value, + self.log_bits + self.line_bits + self.flag_bits, + self.module_bits, + ) + + def __iter__(self): + return iter(asdict(self).items()) + + def __dict__(self): + return asdict(self) class FormatStringWithMetadata: """Parses metadata from a log format string with metadata fields.""" + _FIELD_KEY = re.compile(r'■([a-zA-Z]\w*)♦', flags=re.ASCII) def __init__(self, string: str) -> None: |