From fd3ea91b4444e094c73bcb00ace19e6a820c263e Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Fri, 12 Jun 2020 13:23:31 +0930 Subject: [PATCH] pyln.proto.message: expose array types, add set_field for Message class. Exposing the array types is required for our dummyrunner in the lnprototest suite, since it wants to be able to generate fake fields. The set_field is similarly useful. Signed-off-by: Rusty Russell --- .../pyln-proto/pyln/proto/message/__init__.py | 4 ++++ .../pyln-proto/pyln/proto/message/message.py | 22 ++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/contrib/pyln-proto/pyln/proto/message/__init__.py b/contrib/pyln-proto/pyln/proto/message/__init__.py index 7367d53f3..286afb194 100644 --- a/contrib/pyln-proto/pyln/proto/message/__init__.py +++ b/contrib/pyln-proto/pyln/proto/message/__init__.py @@ -1,3 +1,4 @@ +from .array_types import SizedArrayType, DynamicArrayType, EllipsisArrayType from .message import MessageNamespace, MessageType, Message, SubtypeType from .fundamental_types import split_field, FieldType @@ -10,6 +11,9 @@ __all__ = [ "SubtypeType", "FieldType", "split_field", + "SizedArrayType", + "DynamicArrayType", + "EllipsisArrayType", # fundamental_types 'byte', diff --git a/contrib/pyln-proto/pyln/proto/message/message.py b/contrib/pyln-proto/pyln/proto/message/message.py index bd2bd86a8..2f498e7ef 100644 --- a/contrib/pyln-proto/pyln/proto/message/message.py +++ b/contrib/pyln-proto/pyln/proto/message/message.py @@ -545,22 +545,24 @@ class Message(object): # Convert arguments from strings to values if necessary. for field in kwargs: - f = self.messagetype.find_field(field) - if f is None: - raise ValueError("Unknown field {}".format(field)) - - v = kwargs[field] - if isinstance(v, str): - v, remainder = f.fieldtype.val_from_str(v) - if remainder != '': - raise ValueError('Unexpected {} at end of initializer for {}'.format(remainder, field)) - self.fields[field] = v + self.set_field(field, kwargs[field]) bad_lens = self.messagetype.len_fields_bad(self.messagetype.name, self.fields) if bad_lens: raise ValueError("Inconsistent length fields: {}".format(bad_lens)) + def set_field(self, field: str, val: Any) -> None: + f = self.messagetype.find_field(field) + if f is None: + raise ValueError("Unknown field {}".format(field)) + + if isinstance(val, str): + val, remainder = f.fieldtype.val_from_str(val) + if remainder != '': + raise ValueError('Unexpected {} at end of initializer for {}'.format(remainder, field)) + self.fields[field] = val + def missing_fields(self) -> List[str]: """Are any required fields missing?""" missing: List[str] = []