using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
namespace CliFx.Schema;
///
/// Describes an individual command, with its parameter and option bindings.
///
public class CommandSchema(
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type,
string? name,
string? description,
IReadOnlyList parameters,
IReadOnlyList options
)
{
///
/// Underlying CLR type of the command.
///
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
public Type Type { get; } = type;
///
/// Command name.
///
public string? Name { get; } = name;
///
/// Whether this command is the application's default command.
///
public bool IsDefault { get; } = string.IsNullOrWhiteSpace(name);
///
/// Command description.
///
public string? Description { get; } = description;
///
/// Command parameters.
///
public IReadOnlyList Parameters { get; } = parameters;
///
/// Command options.
///
public IReadOnlyList Options { get; } = options;
internal bool MatchesName(string? name) =>
!string.IsNullOrWhiteSpace(Name)
? string.Equals(name, Name, StringComparison.OrdinalIgnoreCase)
: string.IsNullOrWhiteSpace(name);
internal IReadOnlyDictionary GetValues(ICommand instance)
{
var result = new Dictionary();
foreach (var parameterSchema in Parameters)
{
var value = parameterSchema.Property.GetValue(instance);
result[parameterSchema] = value;
}
foreach (var optionSchema in Options)
{
var value = optionSchema.Property.GetValue(instance);
result[optionSchema] = value;
}
return result;
}
}