Source code for nostress.main
"""Main CLI application entry point."""
import typer
from rich.console import Console
from rich.traceback import install
from . import __version__
from .cli.base import handle_exception
from .exceptions import NostressError
# Install rich traceback handler for better error display
install(show_locals=True)
# Create main application
app = typer.Typer(
name="nostress",
help=(
"Modern Python CLI for Nostr interactions - "
"key generation, event creation, and relay management"
),
add_completion=False,
rich_markup_mode="rich",
context_settings={"help_option_names": ["-h", "--help"]},
)
# Global options
console = Console()
[docs]
def version_callback(value: bool):
"""Show version and exit."""
if value:
console.print(f"nostress version {__version__}")
raise typer.Exit()
[docs]
def verbose_callback(value: bool):
"""Set verbose mode."""
if value:
console.print("[dim]Verbose mode enabled[/dim]")
return value
[docs]
@app.callback()
def main_callback(
version: bool | None = typer.Option(
None,
"--version",
"-V",
callback=version_callback,
is_eager=True,
help="Show version and exit",
),
verbose: bool = typer.Option(
False, "--verbose", "-v", help="Enable verbose output"
),
) -> None:
"""Modern Python CLI for Nostr interactions.
This CLI provides tools for:
• Generating and managing Nostr keypairs
• Creating and signing Nostr events
• Interacting with Nostr relays
"""
# Store global options - simplified approach without context
if verbose:
console.print("[dim]Verbose mode enabled[/dim]")
# Set a global variable for now (could use click.Context in future)
import os
if verbose:
os.environ["NOSTRESS_VERBOSE"] = "1"
# Import and register command groups
from .cli import keys, tips # noqa: E402
app.add_typer(keys.app, name="keys", help="Key generation and management commands")
app.add_typer(
tips.app,
name="tips",
help="Tips and sponsorship information for supporting Nostr development",
)
[docs]
def main() -> None:
"""Entry point for the CLI application."""
try:
app()
except KeyboardInterrupt:
console.print("\n[yellow]Operation cancelled by user[/yellow]")
typer.Exit(1)
except NostressError as e:
# Get verbose setting from environment variable
import os
verbose = os.environ.get("NOSTRESS_VERBOSE", "").strip() == "1"
handle_exception(e, verbose=verbose)
except Exception as e:
# Get verbose setting from environment variable
import os
verbose = os.environ.get("NOSTRESS_VERBOSE", "").strip() == "1"
handle_exception(e, verbose=verbose)
if __name__ == "__main__":
main()