from dataclasses import dataclass @dataclass(frozen=True) class CommandTarget: command:str|None vault:str|None paths:tuple[str, ...] DEFAULT_PATH_KEYS = {"path", "file", "folder", "to"} PATH_KEYS_BY_COMMAND = { "rename": DEFAULT_PATH_KEYS | {"name"}, } def parse_kv_arg(arg:str) -> tuple[str, str]|None: if "=" not in arg: return None key, value = arg.split("=", 1) if not key: return None return key, value def path_keys_for_command(command:str|None) -> set[str]: return PATH_KEYS_BY_COMMAND.get(command or "", DEFAULT_PATH_KEYS) def extract_command_target(args:list[str]) -> CommandTarget: vault:str|None = None command:str|None = None paths:list[str] = [] for arg in args: parsed = parse_kv_arg(arg) if parsed and parsed[0] == "vault" and command is None: vault = parsed[1] continue command = arg break path_keys = path_keys_for_command(command) for arg in args: parsed = parse_kv_arg(arg) if not parsed: continue key, value = parsed if key in path_keys and value: paths.append(value) return CommandTarget(command=command, vault=vault, paths=tuple(paths))