21 lines
543 B
Python
21 lines
543 B
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import re
|
||
|
|
from dataclasses import dataclass
|
||
|
|
|
||
|
|
ADDRESS = re.compile(r"^@([a-z0-9][a-z0-9._-]*):(?:[ \t]*)(.+)$", re.IGNORECASE)
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass(frozen=True)
|
||
|
|
class RoutedMessage:
|
||
|
|
target_repo: str
|
||
|
|
body: str
|
||
|
|
|
||
|
|
|
||
|
|
def parse_address_line(line: str) -> RoutedMessage | None:
|
||
|
|
"""Parse one complete direct-address line; ordinary input returns None."""
|
||
|
|
match = ADDRESS.match(line.rstrip("\r\n"))
|
||
|
|
if not match:
|
||
|
|
return None
|
||
|
|
return RoutedMessage(target_repo=match.group(1), body=match.group(2))
|