Verified Commit 972a3d7c authored by Dom Sekotill's avatar Dom Sekotill
Browse files

Make BaseClient message parsing clearer with a pattern match statement

parent da5f65ad
Loading
Loading
Loading
Loading
+22 −21
Original line number Diff line number Diff line
@@ -277,24 +277,25 @@ class BaseClient:
			raise anyio.ClosedResourceError

		self.logger.debug("Received: %s", repr(msg))
		match = self.event_regex.match(msg)

		# If matched, it is an event
		if match:
			prio_, name, msg = match.groups()
			prio = EventPriority(int(prio_))

		# If it's not an event, check whether a reply to a sent message is expected
		elif self._reply is not _ReplyState.AWAITING:
			self.logger.warning("Unexpected response message: %s", msg)
			return
		else:
		match self._parse_message(msg):
			case str(msg):
				if self._reply is _ReplyState.AWAITING:
					self._reply = msg
			return

				else:
					self.logger.warning("Unexpected response message: %s", msg)
			case [prio, name, message] if name is None:
				# Unnamed events are just for logging
		if not name:
			self.logger.log(prio.get_logger_level(), msg)
			return

		self._event = (prio, name, msg or None)
				assert message is not None, "empty log message received"
				self.logger.log(prio.get_logger_level(), message)
			case [prio, str(name), message]:
				self._event = (prio, name, message)
			case _:  # pragma: no-cover
				raise AssertionError("unexpected return from BaseClient._parse_message()")

	@classmethod
	def _parse_message(cls, message: str) -> tuple[EventPriority, str|None, str|None] | str:
		if not (rematch := cls.event_regex.match(message)):
			return message
		prio_, name, msg = rematch.groups()
		return EventPriority(int(prio_)), name, msg