From c0d6d68adb0680207af4216102f40453aae403cf Mon Sep 17 00:00:00 2001 From: Markov Andrey Date: Tue, 30 Jun 2026 09:25:23 +0000 Subject: [PATCH] Add new file --- core/utils/arg_parser.py | 62 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 core/utils/arg_parser.py diff --git a/core/utils/arg_parser.py b/core/utils/arg_parser.py new file mode 100644 index 0000000..ea1b750 --- /dev/null +++ b/core/utils/arg_parser.py @@ -0,0 +1,62 @@ +# -*- 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 \ No newline at end of file