src.sysadmin.sysadmin_cli_adapter

CLI adapter for sysadmin operations.

  1"""CLI adapter for sysadmin operations."""
  2
  3import sys
  4from dataclasses import asdict
  5from typing import override
  6
  7import msgspec
  8
  9from src.credential_configurations.credential_configurations_service import (
 10    CredentialConfigurationsService,
 11)
 12from src.credential_configurations.models import (
 13    CredentialConfiguration,
 14)
 15
 16from .sysadmin_port import SysadminPort
 17
 18USAGE = """\
 19Usage: ec-issuer <command> [args]
 20
 21Commands:
 22    credential-configuration  - Manage credential configurations
 23"""
 24
 25CREDENTIAL_CONFIG_USAGE = """\
 26Usage: ec-issuer credential-configuration <command> [args]
 27
 28Commands:
 29    create <id> - Create a new config (reads JSON from stdin)
 30    show <id>   - Show a credential configuration by ID
 31    update <id> - Update a config (reads JSON from stdin)
 32    list        - List all credential configurations
 33"""
 34
 35
 36class SysadminCliAdapter(SysadminPort):
 37    """CLI adapter for sysadmin operations."""
 38
 39    _credential_configurations_service: CredentialConfigurationsService
 40
 41    def __init__(
 42        self, credential_configurations_service: CredentialConfigurationsService
 43    ) -> None:
 44        """Initialize the adapter.
 45
 46        Args:
 47            service: The credential configurations service.
 48        """
 49        self._credential_configurations_service = credential_configurations_service
 50
 51    @override
 52    def run(self, command: list[str]) -> None:
 53        """Run a sysadmin command.
 54
 55        Args:
 56            command: The command and its arguments.
 57        """
 58        match command:
 59            case []:
 60                print(USAGE, file=sys.stderr)
 61                sys.exit(1)
 62            case ["credential-configuration"]:
 63                print(CREDENTIAL_CONFIG_USAGE, file=sys.stderr)
 64                sys.exit(1)
 65            case ["credential-configuration", "create", config_id]:
 66                self._handle_create(config_id)
 67            case ["credential-configuration", "show", config_id]:
 68                self._handle_show(config_id)
 69            case ["credential-configuration", "list"]:
 70                self._handle_list()
 71            case ["credential-configuration", "update", config_id]:
 72                self._handle_update(config_id)
 73            case ["credential-configuration", *_]:
 74                print(CREDENTIAL_CONFIG_USAGE, file=sys.stderr)
 75                sys.exit(1)
 76            case _:
 77                print(USAGE, file=sys.stderr)
 78                sys.exit(1)
 79
 80    def _handle_create(self, config_id: str) -> None:
 81        """Handle the create command."""
 82        try:
 83            input_json = sys.stdin.read()
 84            configuration: CredentialConfiguration = msgspec.json.decode(
 85                input_json, type=CredentialConfiguration
 86            )
 87            configuration.credential_configuration_id = config_id
 88            result = self._credential_configurations_service.create(configuration)
 89            print(msgspec.json.encode(asdict(result)).decode())
 90        except Exception as e:
 91            print(f"Error: {e}", file=sys.stderr)
 92            sys.exit(1)
 93
 94    def _handle_show(self, config_id: str) -> None:
 95        """Handle the show command."""
 96        try:
 97            result = self._credential_configurations_service.get(config_id)
 98            print(msgspec.json.encode(asdict(result)).decode())
 99        except Exception as e:
100            print(f"Error: {e}", file=sys.stderr)
101            sys.exit(1)
102
103    def _handle_list(self) -> None:
104        """Handle the list command."""
105        try:
106            results = self._credential_configurations_service.list()
107            # Convert to list of dicts for JSON serialization
108            results_list = [asdict(r) for r in results]
109            print(msgspec.json.encode(results_list).decode())
110        except Exception as e:
111            print(f"Error: {e}", file=sys.stderr)
112            sys.exit(1)
113
114    def _handle_update(self, config_id: str) -> None:
115        """Handle the update command."""
116        self._handle_create(config_id)
USAGE = 'Usage: ec-issuer <command> [args]\n\nCommands:\n credential-configuration - Manage credential configurations\n'
CREDENTIAL_CONFIG_USAGE = 'Usage: ec-issuer credential-configuration <command> [args]\n\nCommands:\n create <id> - Create a new config (reads JSON from stdin)\n show <id> - Show a credential configuration by ID\n update <id> - Update a config (reads JSON from stdin)\n list - List all credential configurations\n'
class SysadminCliAdapter(src.sysadmin.sysadmin_port.SysadminPort):
 37class SysadminCliAdapter(SysadminPort):
 38    """CLI adapter for sysadmin operations."""
 39
 40    _credential_configurations_service: CredentialConfigurationsService
 41
 42    def __init__(
 43        self, credential_configurations_service: CredentialConfigurationsService
 44    ) -> None:
 45        """Initialize the adapter.
 46
 47        Args:
 48            service: The credential configurations service.
 49        """
 50        self._credential_configurations_service = credential_configurations_service
 51
 52    @override
 53    def run(self, command: list[str]) -> None:
 54        """Run a sysadmin command.
 55
 56        Args:
 57            command: The command and its arguments.
 58        """
 59        match command:
 60            case []:
 61                print(USAGE, file=sys.stderr)
 62                sys.exit(1)
 63            case ["credential-configuration"]:
 64                print(CREDENTIAL_CONFIG_USAGE, file=sys.stderr)
 65                sys.exit(1)
 66            case ["credential-configuration", "create", config_id]:
 67                self._handle_create(config_id)
 68            case ["credential-configuration", "show", config_id]:
 69                self._handle_show(config_id)
 70            case ["credential-configuration", "list"]:
 71                self._handle_list()
 72            case ["credential-configuration", "update", config_id]:
 73                self._handle_update(config_id)
 74            case ["credential-configuration", *_]:
 75                print(CREDENTIAL_CONFIG_USAGE, file=sys.stderr)
 76                sys.exit(1)
 77            case _:
 78                print(USAGE, file=sys.stderr)
 79                sys.exit(1)
 80
 81    def _handle_create(self, config_id: str) -> None:
 82        """Handle the create command."""
 83        try:
 84            input_json = sys.stdin.read()
 85            configuration: CredentialConfiguration = msgspec.json.decode(
 86                input_json, type=CredentialConfiguration
 87            )
 88            configuration.credential_configuration_id = config_id
 89            result = self._credential_configurations_service.create(configuration)
 90            print(msgspec.json.encode(asdict(result)).decode())
 91        except Exception as e:
 92            print(f"Error: {e}", file=sys.stderr)
 93            sys.exit(1)
 94
 95    def _handle_show(self, config_id: str) -> None:
 96        """Handle the show command."""
 97        try:
 98            result = self._credential_configurations_service.get(config_id)
 99            print(msgspec.json.encode(asdict(result)).decode())
100        except Exception as e:
101            print(f"Error: {e}", file=sys.stderr)
102            sys.exit(1)
103
104    def _handle_list(self) -> None:
105        """Handle the list command."""
106        try:
107            results = self._credential_configurations_service.list()
108            # Convert to list of dicts for JSON serialization
109            results_list = [asdict(r) for r in results]
110            print(msgspec.json.encode(results_list).decode())
111        except Exception as e:
112            print(f"Error: {e}", file=sys.stderr)
113            sys.exit(1)
114
115    def _handle_update(self, config_id: str) -> None:
116        """Handle the update command."""
117        self._handle_create(config_id)

CLI adapter for sysadmin operations.

SysadminCliAdapter( credential_configurations_service: src.credential_configurations.credential_configurations_service.CredentialConfigurationsService)
42    def __init__(
43        self, credential_configurations_service: CredentialConfigurationsService
44    ) -> None:
45        """Initialize the adapter.
46
47        Args:
48            service: The credential configurations service.
49        """
50        self._credential_configurations_service = credential_configurations_service

Initialize the adapter.

Args: service: The credential configurations service.

@override
def run(self, command: list[str]) -> None:
52    @override
53    def run(self, command: list[str]) -> None:
54        """Run a sysadmin command.
55
56        Args:
57            command: The command and its arguments.
58        """
59        match command:
60            case []:
61                print(USAGE, file=sys.stderr)
62                sys.exit(1)
63            case ["credential-configuration"]:
64                print(CREDENTIAL_CONFIG_USAGE, file=sys.stderr)
65                sys.exit(1)
66            case ["credential-configuration", "create", config_id]:
67                self._handle_create(config_id)
68            case ["credential-configuration", "show", config_id]:
69                self._handle_show(config_id)
70            case ["credential-configuration", "list"]:
71                self._handle_list()
72            case ["credential-configuration", "update", config_id]:
73                self._handle_update(config_id)
74            case ["credential-configuration", *_]:
75                print(CREDENTIAL_CONFIG_USAGE, file=sys.stderr)
76                sys.exit(1)
77            case _:
78                print(USAGE, file=sys.stderr)
79                sys.exit(1)

Run a sysadmin command.

Args: command: The command and its arguments.