This is an abstraction that represents a single message either sent to
or received from the server. It is used to subclass the
AsyncProtocol(Generic[T]) type.
It was written such that it can be populated by either raw data or by a
dict, with the other form being generated on-demand, as-needed.
It behaves almost exactly like a dict, but has some extra methods and a
special constructor. (It should quack fairly convincingly.)
Signed-off-by: John Snow <jsnow@redhat.com>
---
message.py | 196 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 196 insertions(+)
create mode 100644 message.py
diff --git a/message.py b/message.py
new file mode 100644
index 0000000..5c7e828
--- /dev/null
+++ b/message.py
@@ -0,0 +1,196 @@
+"""
+QMP Message format and errors.
+
+This module provides the `Message` class, which represents a single QMP
+message sent to or from the server. Several error-classes that depend on
+knowing the format of this message are also included here.
+"""
+
+import json
+from json import JSONDecodeError
+from typing import (
+ Dict,
+ ItemsView,
+ Iterable,
+ KeysView,
+ Optional,
+ Union,
+ ValuesView,
+)
+
+from error import (
+ DeserializationError,
+ ProtocolError,
+ UnexpectedTypeError,
+)
+
+
+class Message:
+ """
+ Represents a single QMP protocol message.
+
+ QMP uses JSON objects as its basic communicative unit; so this
+ object behaves like a MutableMapping. It may be instantiated from
+ either another mapping (like a dict), or from raw bytes that still
+ need to be deserialized.
+
+ :param value: Initial value, if any.
+ :param eager: When true, attempt to serialize (or deserialize) the
+ initial value immediately, such that conversion exceptions
+ are raised during the call to the initialization method.
+ """