Skip to content
Snippets Groups Projects
cli.py 1.33 KiB
Newer Older
boo's avatar
boo committed
from typing import Callable, Protocol

import traceback
from CellFrame import AppCliServer
from DAP.Core import logIt
from optparse import OptionParser
from pycfhelpers.node.types import ReplyId


class ReplyObject:
    def __init__(self, reply_id: ReplyId):
        self.reply_id = reply_id

    def reply(self, message: str):
        AppCliServer.setReplyText(message, self.reply_id)


class CliCallback(Protocol):
    def __call__(self, *args, reply_object: ReplyObject, **kwargs) -> None:
        pass


boo's avatar
boo committed
class CFCliCommand:
boo's avatar
boo committed
    def __init__(self, command: str, callback: CliCallback, help_text: str = ""):
        """
        Use https://docs.python.org/3.10/library/optparse.html, for configuration cli command
        """
        self.command = command
        self.callback = callback
        self.help_text = help_text
        self.parser = OptionParser()

boo's avatar
boo committed
    def register(self):
boo's avatar
boo committed
        def callback_wrapper(argv: list[str], reply_id: ReplyId):
            (options, args) = self.parser.parse_args(argv[1:])
            self.callback(*args, reply_object=ReplyObject(reply_id), **options.__dict__)

        help_text = self.help_text or self.parser.format_help()
        try:
            AppCliServer.cmdItemCreate(self.command, callback_wrapper, help_text, "")
        except Exception:
            logIt.error(f"Error = {traceback.format_exc()}")