using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
namespace CliFx.Binding;
///
/// Describes a binding between a CLR type and a command.
///
public class CommandDescriptor(
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
Type type,
string? name,
string? description,
IReadOnlyList examples,
IReadOnlyList inputs
)
{
///
/// CLR type of the command.
///
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
public Type Type { get; } = type;
///
public string? Name { get; } = name;
internal bool IsDefault => string.IsNullOrWhiteSpace(Name);
///
public string? Description { get; } = description;
///
public IReadOnlyList Examples { get; } = examples;
///
/// Inputs (parameters and options) of the command;
///
public IReadOnlyList Inputs { get; } = inputs;
internal IReadOnlyList Parameters { get; } =
inputs.OfType().ToArray();
internal IReadOnlyList Options { get; } =
inputs.OfType().ToArray();
internal bool MatchesName(string? name) =>
!string.IsNullOrWhiteSpace(Name)
? string.Equals(name, Name, StringComparison.OrdinalIgnoreCase)
: string.IsNullOrWhiteSpace(name);
///
public override string ToString() => !string.IsNullOrWhiteSpace(Name) ? Name : "";
}
///
///
/// Generic version used by source-generated code for static type references and AOT compatibility.
///
public class CommandDescriptor<
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
TCommand
>(
string? name,
string? description,
IReadOnlyList examples,
IReadOnlyList inputs
) : CommandDescriptor(typeof(TCommand), name, description, examples, inputs)
where TCommand : ICommand;