from __future__ import annotations import os import sys from pathlib import Path import typer from typer._completion_shared import install, _get_shell_name from typer._completion_classes import completion_init from zshell.subcommands import shell, scheme, screenshot, wallpaper, record app = typer.Typer(name="zshell-cli", add_completion=False) app.add_typer(shell.app, name="shell") app.add_typer(scheme.app, name="scheme") app.add_typer(screenshot.app, name="screenshot") app.add_typer(wallpaper.app, name="wallpaper") app.add_typer(record.app, name="record") def _completion_installed() -> bool: shell = _get_shell_name() match shell: case "zsh": return (Path.home() / ".zfunc" / "_zshell-cli").exists() case "bash": return (Path.home() / ".bash_completions" / "zshell-cli.sh").exists() case "fish": return (Path.home() / ".config" / "fish" / "completions" / "zshell-cli.fish").exists() return False def _install_completion() -> None: if _completion_installed(): print("zshell-cli: Shell completion already installed.") sys.exit(0) shell = _get_shell_name() if shell is None: print("zshell-cli: Unable to detect shell type.", file=sys.stderr) sys.exit(1) try: _, path = install(prog_name="zshell-cli") print(f"zshell-cli: Shell completion installed ({shell}: {path})") print("zshell-cli: Restart your shell or source the file to enable tab-completion.") except Exception as e: print(f"zshell-cli: Failed to install shell completion: {e}", file=sys.stderr) raise typer.Exit(code=1) def main() -> None: if "--install-autocomplete" in sys.argv: _install_completion() return if "_ZSHELL_CLI_COMPLETE" in os.environ: completion_init() if sys.stdout.isatty() and not _completion_installed(): print("zshell-cli: Tip: run with --install-autocomplete for tab completion.", file=sys.stderr) app()