folio / src /focli /commands /__init__.py
dystomachina's picture
feat: Implement Folio CLI Phase 1 - Interactive Shell
f56729d
"""
Command registry and execution for the Folio CLI.
This module provides a central registry for all commands and handles command execution.
"""
from collections.abc import Callable
from typing import Any
# Import command modules
from .help import help_command
from .portfolio import portfolio_command
from .position import position_command
from .simulate import simulate_command
# Command registry
_COMMANDS = {}
def register_command(
name: str, handler: Callable, help_text: str, subcommands: list[str] | None = None
):
"""Register a command with the command registry.
Args:
name: Command name
handler: Function that handles the command
help_text: Help text for the command
subcommands: List of subcommands (if any)
"""
_COMMANDS[name] = {
"handler": handler,
"help": help_text,
"subcommands": subcommands,
}
def get_command_registry():
"""Get the command registry.
Returns:
Dictionary of registered commands
"""
return _COMMANDS
def execute_command(command_line: str, state: dict[str, Any], console):
"""Execute a command from the command line.
Args:
command_line: Full command line to execute
state: Application state dictionary
console: Rich console for output
"""
# Parse the command line
parts = command_line.strip().split()
if not parts:
return
command = parts[0].lower()
args = parts[1:]
# Check if the command exists
if command not in _COMMANDS:
console.print(f"[bold red]Unknown command:[/bold red] {command}")
console.print("Type 'help' to see available commands.")
return
# Execute the command
try:
_COMMANDS[command]["handler"](args, state, console)
except Exception as e:
console.print(
f"[bold red]Error executing command '{command}':[/bold red] {e!s}"
)
# Import command modules
# Register commands
register_command("help", help_command, "Show help information")
register_command(
"simulate",
simulate_command,
"Simulate portfolio performance with SPY changes",
["spy", "scenario"],
)
register_command("position", position_command, "Analyze a specific position group")
register_command(
"portfolio",
portfolio_command,
"View and analyze portfolio",
["list", "summary", "load"],
)
register_command("exit", lambda *args: None, "Exit the application")