using System.CommandLine; using System.CommandLine.Parsing; using ZB.MOM.WW.ScadaBridge.Commons.Messages.Management; namespace ZB.MOM.WW.ScadaBridge.CLI.Commands; public static class ApiMethodCommands { /// /// Builds the api-method CLI command group with subcommands for managing inbound API methods. /// /// Global option for the management URL. /// Global option for the output format. /// Global option for the authentication username. /// Global option for the authentication password. /// The configured api-method command with all subcommands registered. public static Command Build(Option urlOption, Option formatOption, Option usernameOption, Option passwordOption) { var command = new Command("api-method") { Description = "Manage inbound API methods" }; command.Add(BuildList(urlOption, formatOption, usernameOption, passwordOption)); command.Add(BuildGet(urlOption, formatOption, usernameOption, passwordOption)); command.Add(BuildCreate(urlOption, formatOption, usernameOption, passwordOption)); command.Add(BuildUpdate(urlOption, formatOption, usernameOption, passwordOption)); command.Add(BuildDelete(urlOption, formatOption, usernameOption, passwordOption)); return command; } private static Command BuildList(Option urlOption, Option formatOption, Option usernameOption, Option passwordOption) { var cmd = new Command("list") { Description = "List all API methods" }; cmd.SetAction(async (ParseResult result) => { return await CommandHelpers.ExecuteCommandAsync( result, urlOption, formatOption, usernameOption, passwordOption, new ListApiMethodsCommand()); }); return cmd; } private static Command BuildGet(Option urlOption, Option formatOption, Option usernameOption, Option passwordOption) { var idOption = new Option("--id") { Description = "API method ID", Required = true }; var cmd = new Command("get") { Description = "Get an API method by ID" }; cmd.Add(idOption); cmd.SetAction(async (ParseResult result) => { var id = result.GetValue(idOption); return await CommandHelpers.ExecuteCommandAsync( result, urlOption, formatOption, usernameOption, passwordOption, new GetApiMethodCommand(id)); }); return cmd; } private static Command BuildCreate(Option urlOption, Option formatOption, Option usernameOption, Option passwordOption) { var nameOption = new Option("--name") { Description = "Method name", Required = true }; var scriptOption = new Option("--script") { Description = "Script code", Required = true }; var timeoutOption = new Option("--timeout") { Description = "Timeout in seconds" }; timeoutOption.DefaultValueFactory = _ => 30; var parametersOption = new Option("--parameters") { Description = "Parameter definitions JSON" }; var returnDefOption = new Option("--return-def") { Description = "Return type definition" }; var cmd = new Command("create") { Description = "Create an API method" }; cmd.Add(nameOption); cmd.Add(scriptOption); cmd.Add(timeoutOption); cmd.Add(parametersOption); cmd.Add(returnDefOption); cmd.SetAction(async (ParseResult result) => { var name = result.GetValue(nameOption)!; var script = result.GetValue(scriptOption)!; var timeout = result.GetValue(timeoutOption); var parameters = result.GetValue(parametersOption); var returnDef = result.GetValue(returnDefOption); return await CommandHelpers.ExecuteCommandAsync( result, urlOption, formatOption, usernameOption, passwordOption, new CreateApiMethodCommand(name, script, timeout, parameters, returnDef)); }); return cmd; } private static Command BuildUpdate(Option urlOption, Option formatOption, Option usernameOption, Option passwordOption) { var idOption = new Option("--id") { Description = "API method ID", Required = true }; var scriptOption = new Option("--script") { Description = "Script code", Required = true }; var timeoutOption = new Option("--timeout") { Description = "Timeout in seconds" }; timeoutOption.DefaultValueFactory = _ => 30; var parametersOption = new Option("--parameters") { Description = "Parameter definitions JSON" }; var returnDefOption = new Option("--return-def") { Description = "Return type definition" }; var cmd = new Command("update") { Description = "Update an API method" }; cmd.Add(idOption); cmd.Add(scriptOption); cmd.Add(timeoutOption); cmd.Add(parametersOption); cmd.Add(returnDefOption); cmd.SetAction(async (ParseResult result) => { var id = result.GetValue(idOption); var script = result.GetValue(scriptOption)!; var timeout = result.GetValue(timeoutOption); var parameters = result.GetValue(parametersOption); var returnDef = result.GetValue(returnDefOption); return await CommandHelpers.ExecuteCommandAsync( result, urlOption, formatOption, usernameOption, passwordOption, new UpdateApiMethodCommand(id, script, timeout, parameters, returnDef)); }); return cmd; } private static Command BuildDelete(Option urlOption, Option formatOption, Option usernameOption, Option passwordOption) { var idOption = new Option("--id") { Description = "API method ID", Required = true }; var cmd = new Command("delete") { Description = "Delete an API method" }; cmd.Add(idOption); cmd.SetAction(async (ParseResult result) => { var id = result.GetValue(idOption); return await CommandHelpers.ExecuteCommandAsync( result, urlOption, formatOption, usernameOption, passwordOption, new DeleteApiMethodCommand(id)); }); return cmd; } }