// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System.Diagnostics.CodeAnalysis;
using AzureMcp.Core.Commands;
using AzureMcp.Core.Commands.Subscription;
using AzureMcp.Kusto.Options;
namespace AzureMcp.Kusto.Commands;
public abstract class BaseClusterCommand<
[DynamicallyAccessedMembers(TrimAnnotations.CommandAnnotations)] TOptions>
: SubscriptionCommand<TOptions> where TOptions : BaseClusterOptions, new()
{
protected readonly Option<string> _clusterNameOption = KustoOptionDefinitions.Cluster;
protected readonly Option<string> _clusterUriOption = KustoOptionDefinitions.ClusterUri;
protected static bool UseClusterUri(BaseClusterOptions options) => !string.IsNullOrEmpty(options.ClusterUri);
protected override void RegisterOptions(Command command)
{
base.RegisterOptions(command);
command.AddOption(_clusterUriOption);
command.AddOption(_clusterNameOption);
command.AddValidator(result =>
{
var validationResult = Validate(result);
if (!validationResult.IsValid)
{
result.ErrorMessage = validationResult.ErrorMessage;
return;
}
});
}
public override ValidationResult Validate(CommandResult parseResult, CommandResponse? commandResponse = null)
{
var validationResult = new ValidationResult { IsValid = true };
var clusterUri = parseResult.GetValueForOption(_clusterUriOption);
var clusterName = parseResult.GetValueForOption(_clusterNameOption);
if (!string.IsNullOrEmpty(clusterUri))
{
// If clusterUri is provided, subscription becomes optional
return validationResult;
}
else
{
var subscription = parseResult.GetValueForOption(_subscriptionOption);
// clusterUri not provided, require both subscription and clusterName
if (string.IsNullOrEmpty(subscription) || string.IsNullOrEmpty(clusterName))
{
validationResult.IsValid = false;
validationResult.ErrorMessage = $"Either --{_clusterUriOption.Name} must be provided, or both --{_subscriptionOption.Name} and --{_clusterNameOption.Name} must be provided.";
if (commandResponse != null)
{
commandResponse.Status = 400;
commandResponse.Message = validationResult.ErrorMessage;
}
}
}
if (validationResult.IsValid)
return base.Validate(parseResult, commandResponse);
return validationResult;
}
protected override TOptions BindOptions(ParseResult parseResult)
{
var options = base.BindOptions(parseResult);
options.ClusterUri = parseResult.GetValueForOption(_clusterUriOption);
options.ClusterName = parseResult.GetValueForOption(_clusterNameOption);
return options;
}
}