subcommand.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from collections.abc import Callable
  2. from typing import TypeVar, Optional
  3. from ..types import Message, Context, Command
  4. from ..failure import RollbotFailure
  5. from .base import Injector, Simple
  6. from .args import ArgListSplitOn, ArgParse, Arg
  7. __all__ = [
  8. "Subcommand",
  9. ]
  10. T = TypeVar("T")
  11. def get_subc_args(msg: Message) -> str:
  12. if (sc := msg.command.get_subcommand()) is not None:
  13. return sc.args
  14. RollbotFailure.MISSING_SUBCOMMAND.raise_exc()
  15. class SubcArgListSplitOn(ArgListSplitOn):
  16. def get_args(self, message: Message) -> str:
  17. return get_subc_args(message)
  18. class SubcArgParse(ArgParse):
  19. def get_args(self, message: Message) -> str:
  20. return get_subc_args(message)
  21. SubcArgList = SubcArgListSplitOn()
  22. class SubcArg(Arg):
  23. def arg_source(self) -> Injector[list[str]]:
  24. return SubcArgList
  25. class _Subcommand(Simple[Optional[Command]]):
  26. Args = Simple[Optional[str]](lambda m, c: get_subc_args(m))
  27. ArgList = SubcArgList
  28. ArgListSplitOn = SubcArgListSplitOn
  29. ArgParse = SubcArgParse
  30. Arg = SubcArg
  31. def __init__(self):
  32. super().__init__(lambda m, c: m.command.get_subcommand())
  33. Subcommand = _Subcommand()