import asyncio class Colors: RESET = "\033[0m" BOLD = "\033[1m" RED = "\033[91m" GREEN = "\033[92m" YELLOW = "\033[93m" BLUE = "\033[94m" MAGENTA = "\033[95m" CYAN = "\033[96m" GRAY = "\033[90m" WHITE = "\033[97m" BG_BLUE = "\033[44m" BG_GREEN = "\033[42m" BG_RED = "\033[41m" class Spinner: def __init__(self, message="Processing...", spinner_chars="|/-\\"): self.message = message self.spinner_chars = spinner_chars self.running = False self.task = None async def start(self): self.running = True self.task = asyncio.create_task(self._spin()) async def stop(self): self.running = False if self.task: await self.task # Clear the line print("\r" + " " * (len(self.message) + 2) + "\r", end="", flush=True) async def _spin(self): i = 0 while self.running: char = self.spinner_chars[i % len(self.spinner_chars)] print(f"\r{Colors.CYAN}{char}{Colors.RESET} {self.message}", end="", flush=True) i += 1 await asyncio.sleep(0.1)