aboutsummaryrefslogtreecommitdiff
path: root/pw_log_tokenized/py/pw_log_tokenized/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'pw_log_tokenized/py/pw_log_tokenized/__init__.py')
-rw-r--r--pw_log_tokenized/py/pw_log_tokenized/__init__.py49
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: