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'
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.