Source code for pymap.parsing.command.any
from __future__ import annotations
from collections.abc import Mapping
from typing import Final
from . import CommandAny, CommandNoArgs
from .. import Space, EndLine, Params
from ..exceptions import NotParseable
from ..primitives import Nil, List, String
__all__ = ['CapabilityCommand', 'LogoutCommand', 'NoOpCommand', 'IdCommand']
[docs]
class CapabilityCommand(CommandNoArgs, CommandAny):
"""The ``CAPABILITY`` command lists current server capabilities."""
command = b'CAPABILITY'
[docs]
class LogoutCommand(CommandNoArgs, CommandAny):
"""The ``LOGOUT`` command ends the IMAP session."""
command = b'LOGOUT'
[docs]
class NoOpCommand(CommandNoArgs, CommandAny):
"""The ``NOOP`` command does nothing, but can be used to check for state
changes on a selected mailbox.
"""
command = b'NOOP'
[docs]
class IdCommand(CommandAny):
"""The ``ID`` command allows the client and server to provide each other
information for statistical purposes and bug reporting.
See Also:
`RFC 2971 <https://tools.ietf.org/html/rfc2971>`_
Args:
tag: The command tag.
parameters: A mapping of the keys and values provided by the client.
"""
command = b'ID'
def __init__(self, tag: bytes, parameters: Mapping[bytes, bytes] | None) \
-> None:
super().__init__(tag)
self.parameters: Final = parameters
[docs]
@classmethod
def parse(cls, buf: memoryview, params: Params) \
-> tuple[IdCommand, memoryview]:
_, buf = Space.parse(buf, params)
parameters: Mapping[bytes, bytes] | None = None
try:
_, buf = Nil.parse(buf, params)
except NotParseable:
parameters, buf = cls._parse_list(buf, params)
_, buf = EndLine.parse(buf, params)
return cls(params.tag, parameters), buf
@classmethod
def _parse_list(cls, buf: memoryview, params: Params) \
-> tuple[Mapping[bytes, bytes], memoryview]:
params_copy = params.copy(expected=[String], list_limit=60)
keyval_list, buf = List.parse(buf, params_copy)
keyval_iter = iter(item.value for item in
keyval_list.get_as(String))
try:
parameters = dict(zip(keyval_iter, keyval_iter, strict=True))
except ValueError as exc:
raise NotParseable(buf) from exc
return parameters, buf