fdf
This commit is contained in:
79
cmdnat/_parsing.py
Normal file
79
cmdnat/_parsing.py
Normal file
@@ -0,0 +1,79 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any, Iterable, List, Optional, Sequence
|
||||
|
||||
VALUE_ARG_FLAGS = frozenset({"-value", "--value", "-set-value", "--set-value"})
|
||||
|
||||
|
||||
def extract_piped_value(result: Any) -> Optional[str]:
|
||||
if isinstance(result, str):
|
||||
return result.strip() if result.strip() else None
|
||||
if isinstance(result, (int, float)):
|
||||
return str(result)
|
||||
if isinstance(result, dict):
|
||||
value = result.get("value")
|
||||
if value is not None:
|
||||
return str(value).strip()
|
||||
return None
|
||||
|
||||
|
||||
def extract_arg_value(
|
||||
args: Sequence[str],
|
||||
*,
|
||||
flags: Iterable[str],
|
||||
allow_positional: bool = False,
|
||||
) -> Optional[str]:
|
||||
if not args:
|
||||
return None
|
||||
|
||||
tokens = [str(tok) for tok in args if tok is not None]
|
||||
normalized_flags = {
|
||||
str(flag).strip().lower() for flag in flags if str(flag).strip()
|
||||
}
|
||||
if not normalized_flags:
|
||||
return None
|
||||
|
||||
for idx, tok in enumerate(tokens):
|
||||
text = tok.strip()
|
||||
if not text:
|
||||
continue
|
||||
low = text.lower()
|
||||
if low in normalized_flags and idx + 1 < len(tokens):
|
||||
candidate = str(tokens[idx + 1]).strip()
|
||||
if candidate:
|
||||
return candidate
|
||||
if "=" in low:
|
||||
head, value = low.split("=", 1)
|
||||
if head in normalized_flags and value:
|
||||
return value.strip()
|
||||
|
||||
if not allow_positional:
|
||||
return None
|
||||
|
||||
for tok in tokens:
|
||||
text = str(tok).strip()
|
||||
if text and not text.startswith("-"):
|
||||
return text
|
||||
return None
|
||||
|
||||
|
||||
def extract_value_arg(args: Sequence[str]) -> Optional[str]:
|
||||
return extract_arg_value(args, flags=VALUE_ARG_FLAGS, allow_positional=True)
|
||||
|
||||
|
||||
def has_flag(args: Sequence[str], flag: str) -> bool:
|
||||
try:
|
||||
want = str(flag or "").strip().lower()
|
||||
if not want:
|
||||
return False
|
||||
return any(str(arg).strip().lower() == want for arg in (args or []))
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
def normalize_to_list(value: Any) -> List[Any]:
|
||||
if value is None:
|
||||
return []
|
||||
if isinstance(value, list):
|
||||
return value
|
||||
return [value]
|
||||
Reference in New Issue
Block a user