On 4/29/21 9:40 AM, marcandre.lur...@redhat.com wrote:
From: Marc-André Lureau <marcandre.lur...@redhat.com>

Introduce IfNot predicate class, for 'not' condition expressions.

Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com>
---
  scripts/qapi/common.py | 22 ++++++++++++++++++++++
  1 file changed, 22 insertions(+)

diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
index 102d347348..6236bfc457 100644
--- a/scripts/qapi/common.py
+++ b/scripts/qapi/common.py
@@ -224,6 +224,28 @@ def __eq__(self, other: object) -> bool:
          return self.option == other.option
+class IfNot(IfPredicate):
+    def __init__(self, pred: IfPredicate):
+        self.pred = pred
+
+    def docgen(self) -> str:
+        return "not " + self.pred.docgen()
+
+    def cgen(self) -> str:
+        return "!" + self.pred.cgen()
+
+    def __bool__(self) -> bool:
+        return bool(self.pred)
+
+    def __repr__(self) -> str:
+        return f"IfNot({self.pred!r})"
+
+    def __eq__(self, other: object) -> bool:
+        if not isinstance(other, type(self)):
+            return False
+        return self.pred == other.pred
+
+

Seems fine. Lot of boilerplate going on, but I don't have quick ideas for reducing it.

So far we have:

IfPredicate (abstract)

IfOption (wraps a <str>)
IfNot (wraps <IfPredicate>)
IfPredicateList (wraps <List[IfPredicate]>)
  - IfAll
  - IfAny

with fairly similar methods and boilerplate. I'm itching to reduce it a little, somehow...

--js

  class IfPredicateList(IfPredicate):
      C_SEP = ""
      DOC_SEP = ""


Tested-by: John Snow <js...@redhat.com>


Reply via email to