# -*- coding: utf-8 -*- """ Утилита для разбора аргументов командной строки в стиле --flag value или --flag. Используется командами бота для извлечения флагов (--global, --title и т.д.) и позиционных аргументов. """ import shlex from typing import Tuple, Dict, List, Any def parse_args(args_str: str) -> Tuple[str, Dict[str, Any], List[str]]: """ Разбирает строку аргументов. Возвращает кортеж: (команда, словарь флагов, список позиционных аргументов). Пример: "!learn --global --title 'Мой документ' file.docx" -> ("!learn", {"global": True, "title": "Мой документ"}, ["file.docx"]) Алгоритм: 1. Разбить строку на части, учитывая кавычки (через shlex.split). 2. Если shlex не справился (непарные кавычки), разбить по пробелам (грубо). 3. Первая часть – имя команды. 4. Далее идём по частям: если часть начинается с '--', то это флаг. - Если следующий элемент не начинается с '--', то это значение флага. - Иначе флаг булевый (True). 5. Всё, что не начинается с '--', – позиционные аргументы. """ if not args_str: return "", {}, [] # Пытаемся разбить с учётом кавычек (shlex) try: parts = shlex.split(args_str) except ValueError: # fallback: просто по пробелам (может быть неточно, но работает для простых случаев) parts = args_str.split() if not parts: return "", {}, [] cmd = parts[0] # первая часть – имя команды flags = {} positionals = [] i = 1 while i < len(parts): p = parts[i] if p.startswith('--'): key = p[2:] # убираем '--' # Если следующий элемент есть и он не флаг, то это значение if i + 1 < len(parts) and not parts[i+1].startswith('--'): flags[key] = parts[i+1] i += 2 else: flags[key] = True i += 1 else: positionals.append(p) i += 1 return cmd, flags, positionals