|
| 1 | +using RT.Util; |
| 2 | +using RT.Util.Consoles; |
| 3 | + |
| 4 | +namespace RT.CommandLine; |
| 5 | + |
| 6 | +/// <summary> |
| 7 | +/// Use this to specify that a field in a class can be specified on the command line using an option, for example |
| 8 | +/// <c>-a</c> or <c>--option-name</c>. The option name(s) MUST begin with a dash (<c>-</c>).</summary> |
| 9 | +/// <param name="names"> |
| 10 | +/// The name of the option. Specify several names as synonyms if required.</param> |
| 11 | +[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false), RummageKeepUsersReflectionSafe] |
| 12 | +public sealed class OptionAttribute(params string[] names) : Attribute |
| 13 | +{ |
| 14 | + /// <summary>All of the names of the option.</summary> |
| 15 | + public string[] Names { get; private set; } = names; |
| 16 | +} |
| 17 | + |
| 18 | +/// <summary> |
| 19 | +/// Use this to specify that a command-line parameter is positional, i.e. is not invoked by an option that starts with |
| 20 | +/// "-".</summary> |
| 21 | +[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false), RummageKeepUsersReflectionSafe] |
| 22 | +public sealed class IsPositionalAttribute : Attribute |
| 23 | +{ |
| 24 | + /// <summary>Constructor.</summary> |
| 25 | + public IsPositionalAttribute() { } |
| 26 | +} |
| 27 | + |
| 28 | +/// <summary>Use this to specify that a command-line parameter is mandatory.</summary> |
| 29 | +[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false), RummageKeepUsersReflectionSafe] |
| 30 | +public sealed class IsMandatoryAttribute() : Attribute |
| 31 | +{ |
| 32 | +} |
| 33 | + |
| 34 | +/// <summary>Specifies that the command-line parser should ignore a field.</summary> |
| 35 | +[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] |
| 36 | +public sealed class IgnoreAttribute : Attribute |
| 37 | +{ |
| 38 | + /// <summary>Constructor.</summary> |
| 39 | + public IgnoreAttribute() { } |
| 40 | +} |
| 41 | + |
| 42 | +/// <summary> |
| 43 | +/// Specifies that a field of an enum type should be interpreted as multiple possible options, each specified by an <see |
| 44 | +/// cref="OptionAttribute"/> on the enum values in the enum type.</summary> |
| 45 | +[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] |
| 46 | +public sealed class EnumOptionsAttribute(EnumBehavior behavior) : Attribute |
| 47 | +{ |
| 48 | + /// <summary> |
| 49 | + /// Specifies whether the enum is considered to represent a single value or a bitfield containing multiple values.</summary> |
| 50 | + public EnumBehavior Behavior { get; private set; } = behavior; |
| 51 | +} |
| 52 | + |
| 53 | +/// <summary> |
| 54 | +/// Use this on a sub-class of an abstract class or on an enum value to specify the command the user must use to invoke |
| 55 | +/// that class or enum value.</summary> |
| 56 | +/// <param name="names"> |
| 57 | +/// The command(s) the user can specify to invoke this class or enum value.</param> |
| 58 | +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Field, Inherited = false, AllowMultiple = false), RummageKeepUsersReflectionSafe] |
| 59 | +public sealed class CommandNameAttribute(params string[] names) : Attribute |
| 60 | +{ |
| 61 | + /// <summary>The command the user can specify to invoke this class.</summary> |
| 62 | + public string[] Names { get; private set; } = names; |
| 63 | +} |
| 64 | + |
| 65 | +/// <summary>Use this on an abstract class to specify that its subclasses represent various commands.</summary> |
| 66 | +[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] |
| 67 | +public sealed class CommandGroupAttribute : Attribute |
| 68 | +{ |
| 69 | + /// <summary>Constructor.</summary> |
| 70 | + public CommandGroupAttribute() { } |
| 71 | +} |
| 72 | + |
| 73 | +/// <summary> |
| 74 | +/// Use this attribute to link a command-line option or command with the help text that describes (documents) it. Suitable |
| 75 | +/// for single-language applications only. See Remarks.</summary> |
| 76 | +/// <remarks> |
| 77 | +/// This attribute specifies the documentation in plain text. All characters are printed exactly as specified. You may |
| 78 | +/// wish to use <see cref="DocumentationRhoMLAttribute"/> to specify documentation with special markup for |
| 79 | +/// command-line-related concepts, as well as <see cref="DocumentationEggsMLAttribute"/> for an alternative markup |
| 80 | +/// language without command-line specific concepts.</remarks> |
| 81 | +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = false), RummageKeepUsersReflectionSafe] |
| 82 | +public class DocumentationAttribute(string documentation) : Attribute |
| 83 | +{ |
| 84 | + /// <summary> |
| 85 | + /// Gets the console-colored documentation string. Note that this property may throw if the text couldn't be parsed |
| 86 | + /// where applicable.</summary> |
| 87 | + public virtual ConsoleColoredString Text => OriginalText; |
| 88 | + /// <summary>Gets a string describing the documentation format to the programmer (not seen by the users).</summary> |
| 89 | + public virtual string OriginalFormat => "Plain text"; |
| 90 | + /// <summary>Gets the original documentation string exactly as specified in the attribute.</summary> |
| 91 | + public string OriginalText { get; private set; } = documentation; |
| 92 | +} |
| 93 | + |
| 94 | +/// <summary> |
| 95 | +/// This is a legacy attribute. Do not use in new programs. This attribute is equivalent to <see |
| 96 | +/// cref="DocumentationEggsMLAttribute"/>.</summary> |
| 97 | +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = false), RummageKeepUsersReflectionSafe] |
| 98 | +public class DocumentationLiteralAttribute(string documentation) : DocumentationEggsMLAttribute(documentation) |
| 99 | +{ |
| 100 | +} |
| 101 | + |
| 102 | +/// <summary> |
| 103 | +/// Use this attribute to link a command-line option or command with the help text that describes (documents) it. Suitable |
| 104 | +/// for single-language applications only. The documentation is to be specified in <see cref="EggsML"/>, which is |
| 105 | +/// interpreted as described in <see cref="CommandLineParser.Colorize(EggsNode)"/>. See also <see |
| 106 | +/// cref="DocumentationRhoMLAttribute"/> and <see cref="DocumentationAttribute"/>.</summary> |
| 107 | +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = false), RummageKeepUsersReflectionSafe] |
| 108 | +public class DocumentationEggsMLAttribute(string documentation) : DocumentationAttribute(documentation) |
| 109 | +{ |
| 110 | + /// <summary>Gets a string describing the documentation format to the programmer (not seen by the users).</summary> |
| 111 | + public override string OriginalFormat { get { return "EggsML"; } } |
| 112 | + /// <summary> |
| 113 | + /// Gets the console-colored documentation string. Note that this property may throw if the text couldn't be parsed |
| 114 | + /// where applicable.</summary> |
| 115 | + public override ConsoleColoredString Text => _parsed ??= CommandLineParser.Colorize(EggsML.Parse(OriginalText)); |
| 116 | + private ConsoleColoredString _parsed; |
| 117 | +} |
| 118 | + |
| 119 | +/// <summary> |
| 120 | +/// Use this attribute to link a command-line option or command with the help text that describes (documents) it. Suitable |
| 121 | +/// for single-language applications only. The documentation is to be specified in <see cref="RhoML"/>, which is |
| 122 | +/// interpreted as described in <see cref="CommandLineParser.Colorize(RhoElement)"/>. See also <see |
| 123 | +/// cref="DocumentationAttribute"/>.</summary> |
| 124 | +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = false), RummageKeepUsersReflectionSafe] |
| 125 | +public class DocumentationRhoMLAttribute(string documentation) : DocumentationAttribute(documentation) |
| 126 | +{ |
| 127 | + /// <summary>Gets a string describing the documentation format to the programmer (not seen by the users).</summary> |
| 128 | + public override string OriginalFormat { get { return "RhoML"; } } |
| 129 | + /// <summary> |
| 130 | + /// Gets the console-colored documentation string. Note that this property may throw if the text couldn't be parsed |
| 131 | + /// where applicable.</summary> |
| 132 | + public override ConsoleColoredString Text => _parsed ??= CommandLineParser.Colorize(RhoML.Parse(OriginalText)); |
| 133 | + private ConsoleColoredString _parsed; |
| 134 | +} |
| 135 | + |
| 136 | +/// <summary> |
| 137 | +/// Specifies that a specific command-line option should not be printed in help pages, i.e. the option should explicitly |
| 138 | +/// be undocumented.</summary> |
| 139 | +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Class, Inherited = false, AllowMultiple = true)] |
| 140 | +public sealed class UndocumentedAttribute : Attribute |
| 141 | +{ |
| 142 | + /// <summary>Constructor.</summary> |
| 143 | + public UndocumentedAttribute() { } |
| 144 | +} |
0 commit comments