def dialogue_reference(self) -> Tuple[str, str]: """Get the dialogue_reference of the message.""" enforce(self.is_set("dialogue_reference"), "dialogue_reference is not set.") return cast(Tuple[str, str], self.get("dialogue_reference"))
def _is_consistent(self) -> bool: """Check that the message follows the state_update protocol.""" try: enforce( isinstance(self.dialogue_reference, tuple), "Invalid type for 'dialogue_reference'. Expected 'tuple'. Found '{}'.".format( type(self.dialogue_reference) ), ) enforce( isinstance(self.dialogue_reference[0], str), "Invalid type for 'dialogue_reference[0]'. Expected 'str'. Found '{}'.".format( type(self.dialogue_reference[0]) ), ) enforce( isinstance(self.dialogue_reference[1], str), "Invalid type for 'dialogue_reference[1]'. Expected 'str'. Found '{}'.".format( type(self.dialogue_reference[1]) ), ) enforce( type(self.message_id) is int, "Invalid type for 'message_id'. Expected 'int'. Found '{}'.".format( type(self.message_id) ), ) enforce( type(self.target) is int, "Invalid type for 'target'. Expected 'int'. Found '{}'.".format( type(self.target) ), ) # Light Protocol Rule 2 # Check correct performative enforce( isinstance(self.performative, StateUpdateMessage.Performative), "Invalid 'performative'. Expected either of '{}'. Found '{}'.".format( self.valid_performatives, self.performative ), ) # Check correct contents actual_nb_of_contents = len(self._body) - DEFAULT_BODY_SIZE expected_nb_of_contents = 0 if self.performative == StateUpdateMessage.Performative.INITIALIZE: expected_nb_of_contents = 4 enforce( isinstance(self.exchange_params_by_currency_id, dict), "Invalid type for content 'exchange_params_by_currency_id'. Expected 'dict'. Found '{}'.".format( type(self.exchange_params_by_currency_id) ), ) for ( key_of_exchange_params_by_currency_id, value_of_exchange_params_by_currency_id, ) in self.exchange_params_by_currency_id.items(): enforce( isinstance(key_of_exchange_params_by_currency_id, str), "Invalid type for dictionary keys in content 'exchange_params_by_currency_id'. Expected 'str'. Found '{}'.".format( type(key_of_exchange_params_by_currency_id) ), ) enforce( isinstance(value_of_exchange_params_by_currency_id, float), "Invalid type for dictionary values in content 'exchange_params_by_currency_id'. Expected 'float'. Found '{}'.".format( type(value_of_exchange_params_by_currency_id) ), ) enforce( isinstance(self.utility_params_by_good_id, dict), "Invalid type for content 'utility_params_by_good_id'. Expected 'dict'. Found '{}'.".format( type(self.utility_params_by_good_id) ), ) for ( key_of_utility_params_by_good_id, value_of_utility_params_by_good_id, ) in self.utility_params_by_good_id.items(): enforce( isinstance(key_of_utility_params_by_good_id, str), "Invalid type for dictionary keys in content 'utility_params_by_good_id'. Expected 'str'. Found '{}'.".format( type(key_of_utility_params_by_good_id) ), ) enforce( isinstance(value_of_utility_params_by_good_id, float), "Invalid type for dictionary values in content 'utility_params_by_good_id'. Expected 'float'. Found '{}'.".format( type(value_of_utility_params_by_good_id) ), ) enforce( isinstance(self.amount_by_currency_id, dict), "Invalid type for content 'amount_by_currency_id'. Expected 'dict'. Found '{}'.".format( type(self.amount_by_currency_id) ), ) for ( key_of_amount_by_currency_id, value_of_amount_by_currency_id, ) in self.amount_by_currency_id.items(): enforce( isinstance(key_of_amount_by_currency_id, str), "Invalid type for dictionary keys in content 'amount_by_currency_id'. Expected 'str'. Found '{}'.".format( type(key_of_amount_by_currency_id) ), ) enforce( type(value_of_amount_by_currency_id) is int, "Invalid type for dictionary values in content 'amount_by_currency_id'. Expected 'int'. Found '{}'.".format( type(value_of_amount_by_currency_id) ), ) enforce( isinstance(self.quantities_by_good_id, dict), "Invalid type for content 'quantities_by_good_id'. Expected 'dict'. Found '{}'.".format( type(self.quantities_by_good_id) ), ) for ( key_of_quantities_by_good_id, value_of_quantities_by_good_id, ) in self.quantities_by_good_id.items(): enforce( isinstance(key_of_quantities_by_good_id, str), "Invalid type for dictionary keys in content 'quantities_by_good_id'. Expected 'str'. Found '{}'.".format( type(key_of_quantities_by_good_id) ), ) enforce( type(value_of_quantities_by_good_id) is int, "Invalid type for dictionary values in content 'quantities_by_good_id'. Expected 'int'. Found '{}'.".format( type(value_of_quantities_by_good_id) ), ) elif self.performative == StateUpdateMessage.Performative.APPLY: expected_nb_of_contents = 2 enforce( isinstance(self.amount_by_currency_id, dict), "Invalid type for content 'amount_by_currency_id'. Expected 'dict'. Found '{}'.".format( type(self.amount_by_currency_id) ), ) for ( key_of_amount_by_currency_id, value_of_amount_by_currency_id, ) in self.amount_by_currency_id.items(): enforce( isinstance(key_of_amount_by_currency_id, str), "Invalid type for dictionary keys in content 'amount_by_currency_id'. Expected 'str'. Found '{}'.".format( type(key_of_amount_by_currency_id) ), ) enforce( type(value_of_amount_by_currency_id) is int, "Invalid type for dictionary values in content 'amount_by_currency_id'. Expected 'int'. Found '{}'.".format( type(value_of_amount_by_currency_id) ), ) enforce( isinstance(self.quantities_by_good_id, dict), "Invalid type for content 'quantities_by_good_id'. Expected 'dict'. Found '{}'.".format( type(self.quantities_by_good_id) ), ) for ( key_of_quantities_by_good_id, value_of_quantities_by_good_id, ) in self.quantities_by_good_id.items(): enforce( isinstance(key_of_quantities_by_good_id, str), "Invalid type for dictionary keys in content 'quantities_by_good_id'. Expected 'str'. Found '{}'.".format( type(key_of_quantities_by_good_id) ), ) enforce( type(value_of_quantities_by_good_id) is int, "Invalid type for dictionary values in content 'quantities_by_good_id'. Expected 'int'. Found '{}'.".format( type(value_of_quantities_by_good_id) ), ) elif self.performative == StateUpdateMessage.Performative.END: expected_nb_of_contents = 0 # Check correct content count enforce( expected_nb_of_contents == actual_nb_of_contents, "Incorrect number of contents. Expected {}. Found {}".format( expected_nb_of_contents, actual_nb_of_contents ), ) # Light Protocol Rule 3 if self.message_id == 1: enforce( self.target == 0, "Invalid 'target'. Expected 0 (because 'message_id' is 1). Found {}.".format( self.target ), ) except (AEAEnforceError, ValueError, KeyError) as e: _default_logger.error(str(e)) return False return True
def performative(self) -> Performative: # type: ignore # noqa: F821 """Get the performative of the message.""" enforce(self.is_set("performative"), "performative is not set.") return cast(StateUpdateMessage.Performative, self.get("performative"))
def target(self) -> int: """Get the target of the message.""" enforce(self.is_set("target"), "target is not set.") return cast(int, self.get("target"))
def message_id(self) -> int: """Get the message_id of the message.""" enforce(self.is_set("message_id"), "message_id is not set.") return cast(int, self.get("message_id"))