62 lines
2.6 KiB
Python
62 lines
2.6 KiB
Python
# -*- 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 |