from adt import ADTMeta # As simple Enum class MouseButton(metaclass=ADTMeta): Left: ... Middle: ... Right: ... # As enum with parameters class UserInput(metaclass=ADTMeta): Nil: ... KeyPress: str KeyRelease: str MouseClick: tuple[MouseButton, int, int] def get_user_input() -> UserInput: # You play around with this return value. return UserInput.MouseClick((MouseButton.Middle, 42, 24)) match get_user_input(): case UserInput.Nil: print("No input") case UserInput.KeyPress(key): print(f"Key {key} was pressed") case UserInput.KeyRelease(key): print(f"Key {key} was released") case UserInput.MouseClick((MouseButton.Middle, x, y)): print(f"The middle mouse button was clicked at ({x}, {y})") case UserInput.MouseClick((button, x, y)): print(f"Mouse clicked ({button}, {x}, {y})")