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; } }