48 lines
1.1 KiB
Python
48 lines
1.1 KiB
Python
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))
|