using System.CommandLine; using System.CommandLine.Parsing; using ScadaLink.Commons.Messages.Management; namespace ScadaLink.CLI.Commands; internal static class CommandHelpers { internal static AuthenticatedUser PlaceholderUser { get; } = new("cli-user", "CLI User", ["Admin", "Design", "Deployment"], Array.Empty()); internal static string NewCorrelationId() => Guid.NewGuid().ToString("N"); internal static async Task ExecuteCommandAsync( ParseResult result, Option contactPointsOption, Option formatOption, object command) { var contactPointsRaw = result.GetValue(contactPointsOption); var format = result.GetValue(formatOption) ?? "json"; if (string.IsNullOrWhiteSpace(contactPointsRaw)) { var config = CliConfig.Load(); if (config.ContactPoints.Count > 0) contactPointsRaw = string.Join(",", config.ContactPoints); } if (string.IsNullOrWhiteSpace(contactPointsRaw)) { OutputFormatter.WriteError("No contact points specified. Use --contact-points or set SCADALINK_CONTACT_POINTS.", "NO_CONTACT_POINTS"); return 1; } var contactPoints = contactPointsRaw.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); await using var connection = new ClusterConnection(); await connection.ConnectAsync(contactPoints, TimeSpan.FromSeconds(10)); var envelope = new ManagementEnvelope(PlaceholderUser, command, NewCorrelationId()); var response = await connection.AskManagementAsync(envelope, TimeSpan.FromSeconds(30)); return HandleResponse(response, format); } internal static int HandleResponse(object response, string format) { switch (response) { case ManagementSuccess success: if (format == "table") WriteAsTable(success.Data); else OutputFormatter.WriteJson(success.Data); return 0; case ManagementError error: OutputFormatter.WriteError(error.Error, error.ErrorCode); return 1; case ManagementUnauthorized unauth: OutputFormatter.WriteError(unauth.Message, "UNAUTHORIZED"); return 2; default: OutputFormatter.WriteError($"Unexpected response type: {response.GetType().Name}", "UNEXPECTED_RESPONSE"); return 1; } } private static void WriteAsTable(object? data) { // For table format, delegate to JSON if data shape is unknown OutputFormatter.WriteJson(data); } }