diff --git a/arpeecee/parser.py b/arpeecee/parser.py new file mode 100644 index 0000000..501f223 --- /dev/null +++ b/arpeecee/parser.py @@ -0,0 +1,72 @@ +"""Sans I/O message parser.""" +from typing import List, Tuple, Union + +import attr +from pyvarint import encode, encoding_length + +__all__ = ["Parser"] + + +# TODO(decentral1se): define encoding logic +class ErrorEncoding: + pass + + +# TODO(decentral1se): define encoding logic +class BinaryEncoding: + pass + + +# TODO(decentral1se): define encoding logic +class NullEncoding: + pass + + +Encoding = Union[ErrorEncoding, BinaryEncoding, NullEncoding] + + +@attr.s(auto_attribs=True) +class Parser: + """RPC message parser.""" + + message: bytes = attr.Factory(bytes) + messages: List[Tuple[int, int, bytes]] = attr.Factory(list) + + varint: int = 0 + factor: int = 1 + length: int = 0 + header: int = 0 + id: int = 0 + state: int = 0 + consumed = 0 + max_size = 8 * 1024 * 1024 + + def send( + self, + type: int, + service: int, + method: str, + id: int, + message: bytes, + encoding: Encoding, + ): + header = (service >> 2) or type + length = ( + encoding.encoding_length(message) + + encoding_length(header) + + encoding_length(method) + + encoding_length(id) + ) + return encode(length) + encode(header) + encode(method) + encode(id) + + def recv(self): + pass + + def _read_msg(self): + pass + + def _read_varint(self): + pass + + def _next_state(self): + pass diff --git a/test/test_parser.py b/test/test_parser.py new file mode 100644 index 0000000..df352d6 --- /dev/null +++ b/test/test_parser.py @@ -0,0 +1,7 @@ +# test single message send +# test single message recv +# test multiple message send +# test multiple message recv +# test single empty message recv +# test single chunked message recv +# test multiple chunked message recv