Source code for pymap.parsing.specials.astring


from __future__ import annotations

import re
from typing import Any

from .. import Params, Parseable
from ..primitives import String, QuotedString

__all__ = ['AString']


[docs] class AString(Parseable[bytes]): """Represents a string that may have quotes (like a quoted-string) or may not (like an atom). Additionally allows the closing square bracket (``]``) character in the unquoted form. Args: string: The string value. raw: The raw bytestring from IMAP parsing. Attributes: string: The string value. """ _pattern = re.compile( br'[\x21\x23\x24\x26\x27\x2B-\x5B\x5D\x5E-\x7A\x7C\x7E]+') def __init__(self, string: bytes, raw: bytes | None = None) -> None: super().__init__() self.string = string self._raw = raw @property def value(self) -> bytes: """The string value.""" return self.string
[docs] @classmethod def parse(cls, buf: memoryview, params: Params) \ -> tuple[AString, memoryview]: start = cls._whitespace_length(buf) match = cls._pattern.match(buf, start) if match: buf = buf[match.end(0):] return cls(match.group(0), match.group(0)), buf string, buf = String.parse(buf, params) return cls(string.value, bytes(string)), buf
def __eq__(self, other: Any) -> bool: if isinstance(other, AString): return self.string == other.string return super().__eq__(other) def __bytes__(self) -> bytes: if self._raw is None: match = self._pattern.fullmatch(self.value) if match: self._raw = self.value else: self._raw = bytes(QuotedString(self.value)) return self._raw