diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index c974161..a3fa77d 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -1,12 +1,13 @@ -{ - "version": 1, - "isRoot": true, - "tools": { - "cake.tool": { - "version": "3.0.0", - "commands": [ - "dotnet-cake" - ] - } - } +{ + "version": 1, + "isRoot": true, + "tools": { + "csharpier": { + "version": "0.30.3", + "commands": [ + "dotnet-csharpier" + ], + "rollForward": false + } + } } \ No newline at end of file diff --git a/.editorconfig b/.editorconfig index 86566f4..126b435 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,260 +1,16 @@ root = true [*] - -# Charset charset = utf-8 - -# New line preferences end_of_line = lf -insert_final_newline = false - -# Indentation and spacing indent_style = tab indent_size = 4 -tab_width = 4 [*.yml] indent_style = space indent_size = 2 -#### .NET Coding Conventions #### - [*.cs] - -# Organize usings -dotnet_separate_import_directive_groups = false -dotnet_sort_system_directives_first = false -file_header_template = unset - -# this. and Me. preferences -dotnet_style_qualification_for_event = false -dotnet_style_qualification_for_field = false -dotnet_style_qualification_for_method = false -dotnet_style_qualification_for_property = false - -# Language keywords vs BCL types preferences -dotnet_style_predefined_type_for_locals_parameters_members = true -dotnet_style_predefined_type_for_member_access = true - -# Parentheses preferences -dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity -dotnet_style_parentheses_in_other_binary_operators = always_for_clarity -dotnet_style_parentheses_in_other_operators = never_if_unnecessary -dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity - -# Modifier preferences -dotnet_style_require_accessibility_modifiers = for_non_interface_members - -# Expression-level preferences -dotnet_style_coalesce_expression = true -dotnet_style_collection_initializer = true -dotnet_style_explicit_tuple_names = true -dotnet_style_namespace_match_folder = true -dotnet_style_null_propagation = true -dotnet_style_object_initializer = true -dotnet_style_operator_placement_when_wrapping = beginning_of_line -dotnet_style_prefer_auto_properties = true -dotnet_style_prefer_collection_expression = when_types_loosely_match -dotnet_style_prefer_compound_assignment = true -dotnet_style_prefer_conditional_expression_over_assignment = true -dotnet_style_prefer_conditional_expression_over_return = true -dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed -dotnet_style_prefer_inferred_anonymous_type_member_names = true -dotnet_style_prefer_inferred_tuple_names = true -dotnet_style_prefer_is_null_check_over_reference_equality_method = true -dotnet_style_prefer_simplified_boolean_expressions = true -dotnet_style_prefer_simplified_interpolation = true - -# Field preferences -dotnet_style_readonly_field = true - -# Parameter preferences -dotnet_code_quality_unused_parameters = all - -# Suppression preferences -dotnet_remove_unnecessary_suppression_exclusions = none - -# New line preferences -dotnet_style_allow_multiple_blank_lines_experimental = true -dotnet_style_allow_statement_immediately_after_block_experimental = true - -#### C# Coding Conventions #### - -# var preferences -csharp_style_var_elsewhere = true -csharp_style_var_for_built_in_types = true -csharp_style_var_when_type_is_apparent = true - -# Expression-bodied members -csharp_style_expression_bodied_accessors = true -csharp_style_expression_bodied_constructors = false -csharp_style_expression_bodied_indexers = true -csharp_style_expression_bodied_lambdas = true -csharp_style_expression_bodied_local_functions = false -csharp_style_expression_bodied_methods = false -csharp_style_expression_bodied_operators = false -csharp_style_expression_bodied_properties = true - -# Pattern matching preferences -csharp_style_pattern_matching_over_as_with_null_check = true -csharp_style_pattern_matching_over_is_with_cast_check = true -csharp_style_prefer_extended_property_pattern = true -csharp_style_prefer_not_pattern = true -csharp_style_prefer_pattern_matching = true -csharp_style_prefer_switch_expression = true - -# Null-checking preferences -csharp_style_conditional_delegate_call = true - -# Modifier preferences -csharp_prefer_static_local_function = true -csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async -csharp_style_prefer_readonly_struct = true -csharp_style_prefer_readonly_struct_member = true - -# Code-block preferences -csharp_prefer_braces = true -csharp_prefer_simple_using_statement = true -csharp_style_namespace_declarations = file_scoped -csharp_style_prefer_method_group_conversion = true -csharp_style_prefer_primary_constructors = true -csharp_style_prefer_top_level_statements = true - -# Expression-level preferences -csharp_prefer_simple_default_expression = true -csharp_style_deconstructed_variable_declaration = true -csharp_style_implicit_object_creation_when_type_is_apparent = true -csharp_style_inlined_variable_declaration = true -csharp_style_prefer_index_operator = true -csharp_style_prefer_local_over_anonymous_function = true -csharp_style_prefer_null_check_over_type_check = true -csharp_style_prefer_range_operator = true -csharp_style_prefer_tuple_swap = true -csharp_style_prefer_utf8_string_literals = true -csharp_style_throw_expression = true -csharp_style_unused_value_assignment_preference = discard_variable -csharp_style_unused_value_expression_statement_preference = discard_variable - -# 'using' directive preferences -csharp_using_directive_placement = outside_namespace:warning - -# New line preferences -csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true -csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true -csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true -csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true -csharp_style_allow_embedded_statements_on_same_line_experimental = true - -#### C# Formatting Rules #### - -# New line preferences -csharp_new_line_before_catch = true -csharp_new_line_before_else = true -csharp_new_line_before_finally = true -csharp_new_line_before_members_in_anonymous_types = true -csharp_new_line_before_members_in_object_initializers = true -csharp_new_line_before_open_brace = all -csharp_new_line_between_query_expression_clauses = true - -# Indentation preferences -csharp_indent_block_contents = true -csharp_indent_braces = false -csharp_indent_case_contents = true -csharp_indent_case_contents_when_block = true -csharp_indent_labels = flush_left -csharp_indent_switch_labels = true - -# Space preferences -csharp_space_after_cast = false -csharp_space_after_colon_in_inheritance_clause = true -csharp_space_after_comma = true -csharp_space_after_dot = false -csharp_space_after_keywords_in_control_flow_statements = true -csharp_space_after_semicolon_in_for_statement = true -csharp_space_around_binary_operators = before_and_after -csharp_space_around_declaration_statements = false -csharp_space_before_colon_in_inheritance_clause = true -csharp_space_before_comma = false -csharp_space_before_dot = false -csharp_space_before_open_square_brackets = false -csharp_space_before_semicolon_in_for_statement = false -csharp_space_between_empty_square_brackets = false -csharp_space_between_method_call_empty_parameter_list_parentheses = false -csharp_space_between_method_call_name_and_opening_parenthesis = false -csharp_space_between_method_call_parameter_list_parentheses = false -csharp_space_between_method_declaration_empty_parameter_list_parentheses = false -csharp_space_between_method_declaration_name_and_open_parenthesis = false -csharp_space_between_method_declaration_parameter_list_parentheses = false -csharp_space_between_parentheses = false -csharp_space_between_square_brackets = false - -# Wrapping preferences -csharp_preserve_single_line_blocks = true -csharp_preserve_single_line_statements = true - -#### Naming styles #### - -# Naming rules - -dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning -dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface -dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i - -dotnet_naming_rule.types_should_be_pascal_case.severity = warning -dotnet_naming_rule.types_should_be_pascal_case.symbols = types -dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case - -dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = warning -dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members -dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case - -# Symbol specifications - -dotnet_naming_symbols.interface.applicable_kinds = interface -dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.interface.required_modifiers = - -dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum -dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.types.required_modifiers = - -dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method -dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.non_field_members.required_modifiers = - -# Naming styles - -dotnet_naming_style.pascal_case.required_prefix = -dotnet_naming_style.pascal_case.required_suffix = -dotnet_naming_style.pascal_case.word_separator = -dotnet_naming_style.pascal_case.capitalization = pascal_case - -dotnet_naming_style.begins_with_i.required_prefix = I -dotnet_naming_style.begins_with_i.required_suffix = -dotnet_naming_style.begins_with_i.word_separator = -dotnet_naming_style.begins_with_i.capitalization = pascal_case - -# Disabled for this project. -## TODO: Enable some -dotnet_diagnostic.CA1031.severity = none # CA1031: Do not catch general exception types -dotnet_diagnostic.CA1401.severity = none # CA1401: P/Invokes should not be visible -dotnet_diagnostic.CA1806.severity = suggestion # CA1806: Do not ignore method results -dotnet_diagnostic.CA1824.severity = none # CA1824: Mark assemblies with NeutralResourcesLanguageAttribute -dotnet_diagnostic.CA1848.severity = none # CA1848: Use the LoggerMessage delegates -dotnet_diagnostic.CA2254.severity = none # CA2254: Template should be a static expression -dotnet_diagnostic.CA5392.severity = none # CA5392: Use DefaultDllImportSearchPaths attribute for P/Invokes -dotnet_diagnostic.CS1591.severity = none # CS1591: Missing XML comment for publicly visible type or member -dotnet_diagnostic.IDE0066.severity = none # IDE0066: Convert switch statement to expression -dotnet_diagnostic.S1135.severity = none # S1135: Track uses of "TODO" tags -dotnet_diagnostic.S125.severity = none # S125: Sections of code should not be commented out -dotnet_diagnostic.S4200.severity = none # S4200: Native methods should be wrapped -dotnet_diagnostic.S6602.severity = none # S6602: "Find" method should be used instead of the "FirstOrDefault" extension -dotnet_diagnostic.S6605.severity = none # S6605: Collection-specific "Exists" method should be used instead of the "Any" extension -dotnet_diagnostic.SA1101.severity = none # SA1101: Prefix local calls with this -dotnet_diagnostic.SA1309.severity = none # SA1309: Field names should not begin with underscore -dotnet_diagnostic.SA1600.severity = none # SA1600: Elements should be documented -dotnet_diagnostic.SA1611.severity = none # SA1611: Element parameters should be documented -dotnet_diagnostic.SA1615.severity = none # SA1615: Element return value should be documented -dotnet_diagnostic.SA1623.severity = none # SA1623: Property summary documentation should match accessors -dotnet_diagnostic.SA1633.severity = none # SA1633: File should have header \ No newline at end of file +dotnet_diagnostic.CS1591.severity = none # CS1591: Missing XML comment for publicly visible type or member +#dotnet_diagnostic.S112.severity = suggestion +#dotnet_diagnostic.CA2201.severity = suggestion diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..31dfec2 --- /dev/null +++ b/build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +./src/build.sh "$@" \ No newline at end of file diff --git a/src/01-Build/NukeBuild/Configuration.cs b/src/01-Build/NukeBuild/Configuration.cs index 8908cb5..90b5dc8 100644 --- a/src/01-Build/NukeBuild/Configuration.cs +++ b/src/01-Build/NukeBuild/Configuration.cs @@ -1,5 +1,5 @@ -using Nuke.Common.Tooling; using System.ComponentModel; +using Nuke.Common.Tooling; [TypeConverter(typeof(TypeConverter))] #pragma warning disable S3903 // Types should be defined in named namespaces // MvdO: NukeBuild convention. @@ -13,4 +13,4 @@ public static implicit operator string(Configuration configuration) { return configuration.Value; } -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/Attributes/ArgumentAttribute.cs b/src/10-Lib/DeclarativeCommandLine/Attributes/ArgumentAttribute.cs index 55cbaf4..b25d1fb 100644 --- a/src/10-Lib/DeclarativeCommandLine/Attributes/ArgumentAttribute.cs +++ b/src/10-Lib/DeclarativeCommandLine/Attributes/ArgumentAttribute.cs @@ -3,9 +3,7 @@ [AttributeUsage(AttributeTargets.Property)] public sealed class ArgumentAttribute : Attribute { - public ArgumentAttribute() - { - } + public ArgumentAttribute() { } public ArgumentAttribute(string name) { @@ -33,4 +31,4 @@ public ArgumentAttribute(string name) public bool LegalFilePathsOnly { get; set; } public string? Name { get; set; } -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/Attributes/BaseCommandAttribute.cs b/src/10-Lib/DeclarativeCommandLine/Attributes/BaseCommandAttribute.cs index 19a227a..aba968b 100644 --- a/src/10-Lib/DeclarativeCommandLine/Attributes/BaseCommandAttribute.cs +++ b/src/10-Lib/DeclarativeCommandLine/Attributes/BaseCommandAttribute.cs @@ -11,4 +11,4 @@ public abstract class BaseCommandAttribute : Attribute public string? Name { get; set; } public bool TreatUnmatchedTokensAsErrors { get; set; } -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/Attributes/CommandAttribute.Generic.cs b/src/10-Lib/DeclarativeCommandLine/Attributes/CommandAttribute.Generic.cs index e7625a4..09cb35d 100644 --- a/src/10-Lib/DeclarativeCommandLine/Attributes/CommandAttribute.Generic.cs +++ b/src/10-Lib/DeclarativeCommandLine/Attributes/CommandAttribute.Generic.cs @@ -13,4 +13,4 @@ public CommandAttribute(string name) { Parent = typeof(TParentCommand); } -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/Attributes/CommandAttribute.cs b/src/10-Lib/DeclarativeCommandLine/Attributes/CommandAttribute.cs index 2f5f272..2cf1207 100644 --- a/src/10-Lib/DeclarativeCommandLine/Attributes/CommandAttribute.cs +++ b/src/10-Lib/DeclarativeCommandLine/Attributes/CommandAttribute.cs @@ -3,9 +3,7 @@ [AttributeUsage(AttributeTargets.Class)] public class CommandAttribute : BaseCommandAttribute { - public CommandAttribute() - { - } + public CommandAttribute() { } public CommandAttribute(string name) { @@ -13,4 +11,4 @@ public CommandAttribute(string name) } public Type Parent { get; set; } -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/Attributes/OptionAttribute.cs b/src/10-Lib/DeclarativeCommandLine/Attributes/OptionAttribute.cs index 88e69d5..055768d 100644 --- a/src/10-Lib/DeclarativeCommandLine/Attributes/OptionAttribute.cs +++ b/src/10-Lib/DeclarativeCommandLine/Attributes/OptionAttribute.cs @@ -3,9 +3,7 @@ [AttributeUsage(AttributeTargets.Property)] public sealed class OptionAttribute : Attribute { - public OptionAttribute() - { - } + public OptionAttribute() { } public OptionAttribute(string name) { @@ -45,4 +43,4 @@ public OptionAttribute(string name, params string[] aliases) public bool LegalFilePathsOnly { get; set; } public string? Name { get; set; } -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/Attributes/RootCommandAttribute.cs b/src/10-Lib/DeclarativeCommandLine/Attributes/RootCommandAttribute.cs index 3a0c66a..522400f 100644 --- a/src/10-Lib/DeclarativeCommandLine/Attributes/RootCommandAttribute.cs +++ b/src/10-Lib/DeclarativeCommandLine/Attributes/RootCommandAttribute.cs @@ -1,6 +1,4 @@ namespace DeclarativeCommandLine.Attributes; [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] -public sealed class RootCommandAttribute : BaseCommandAttribute -{ -} \ No newline at end of file +public sealed class RootCommandAttribute : BaseCommandAttribute { } diff --git a/src/10-Lib/DeclarativeCommandLine/CommandFactory.cs b/src/10-Lib/DeclarativeCommandLine/CommandFactory.cs index 7d85eb8..5f7639a 100644 --- a/src/10-Lib/DeclarativeCommandLine/CommandFactory.cs +++ b/src/10-Lib/DeclarativeCommandLine/CommandFactory.cs @@ -13,4 +13,4 @@ public DelegatingCommandFactory(Func factory) { return _factory(commandType); } -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/DeclarativeCommandLine.csproj b/src/10-Lib/DeclarativeCommandLine/DeclarativeCommandLine.csproj index d6f9e84..2a2050c 100644 --- a/src/10-Lib/DeclarativeCommandLine/DeclarativeCommandLine.csproj +++ b/src/10-Lib/DeclarativeCommandLine/DeclarativeCommandLine.csproj @@ -1,7 +1,5 @@  - - DeclarativeCommandLine DeclarativeCommandLine diff --git a/src/10-Lib/DeclarativeCommandLine/DeclarativeCommandLineFactory.cs b/src/10-Lib/DeclarativeCommandLine/DeclarativeCommandLineFactory.cs index 6a2d36f..365e71c 100644 --- a/src/10-Lib/DeclarativeCommandLine/DeclarativeCommandLineFactory.cs +++ b/src/10-Lib/DeclarativeCommandLine/DeclarativeCommandLineFactory.cs @@ -6,11 +6,14 @@ namespace DeclarativeCommandLine; public class DeclarativeCommandLineFactory( ICommandFactory commandFactory, IServiceProvider serviceProvider, - IEnumerable commandDescriptors) + IEnumerable commandDescriptors +) { - private readonly ICommandFactory _commandFactory = commandFactory ?? throw new ArgumentNullException(nameof(commandFactory)); + private readonly ICommandFactory _commandFactory = + commandFactory ?? throw new ArgumentNullException(nameof(commandFactory)); - private readonly IEnumerable _commandDescriptors = commandDescriptors ?? throw new ArgumentNullException(nameof(commandDescriptors)); + private readonly IEnumerable _commandDescriptors = + commandDescriptors ?? throw new ArgumentNullException(nameof(commandDescriptors)); //public RootCommand BuildRootCommand(params Type[] types) //{ @@ -35,14 +38,15 @@ public RootCommand BuildRootCommand() { root = new CommandDescriptor( typeof(DefaultRootCommand), - new RootCommandAttribute() - { - }); + new RootCommandAttribute() { } + ); } if (roots.Count > 1) { - throw new InvalidOperationException($"Multiple root commands found: {string.Join(", ", roots.Select(c => c.Type))}."); + throw new InvalidOperationException( + $"Multiple root commands found: {string.Join(", ", roots.Select(c => c.Type))}." + ); } // Relate non-root commands without a parent command to the root command. @@ -75,11 +79,17 @@ public async Task InvokeAsync(string[] args) // return await BuildRootCommand(assemblies).InvokeAsync(args).ConfigureAwait(false); //} - private Command BuildCommandTree(IEnumerable cmdDescrs, CommandDescriptor cmdDescr) + private Command BuildCommandTree( + IEnumerable cmdDescrs, + CommandDescriptor cmdDescr + ) { var cmd = cmdDescr.IsRoot ? new RootCommand() - : new Command(cmdDescr.CommandAttribute.Name ?? NameFormatter.CommandTypeToCommandName(cmdDescr.Type)); + : new Command( + cmdDescr.CommandAttribute.Name + ?? NameFormatter.CommandTypeToCommandName(cmdDescr.Type) + ); cmdDescr.Command = cmd; @@ -120,13 +130,20 @@ private Command BuildCommandTree(IEnumerable cmdDescrs, Comma if (cmdDescr.IsExecutable) { - cmdDescr.Command.SetHandler(new Func>(async ctx => - { - var cmdInst = _commandFactory.CreateCommand(cmdDescr.Type) - ?? throw new InvalidOperationException($"Could not create an instance of type '{cmdDescr.Type}'"); - - return await new CommandHandler(cmdDescr).HandlerAsync(cmdInst, ctx).ConfigureAwait(false); - })); + cmdDescr.Command.SetHandler( + new Func>(async ctx => + { + var cmdInst = + _commandFactory.CreateCommand(cmdDescr.Type) + ?? throw new InvalidOperationException( + $"Could not create an instance of type '{cmdDescr.Type}'" + ); + + return await new CommandHandler(cmdDescr) + .HandlerAsync(cmdInst, ctx) + .ConfigureAwait(false); + }) + ); } // Child commands @@ -148,14 +165,17 @@ private Command BuildCommandTree(IEnumerable cmdDescrs, Comma private static void HandleArgument( CommandDescriptor cmdDescr, ArgumentAttribute argAttr, - PropertyInfo prop) + PropertyInfo prop + ) { var argName = argAttr.Name ?? NameFormatter.ToKebabCase(prop.Name); var argType = typeof(Argument<>).MakeGenericType(prop.PropertyType); - var arg = (Argument)Activator.CreateInstance( - argType, // Argument value type - argName, // Argument name - null)!; // Argument description, we set this later + var arg = (Argument) + Activator.CreateInstance( + argType, // Argument value type + argName, // Argument name + null + )!; // Argument description, we set this later // Arity arg.Arity = argAttr.Arity; @@ -204,24 +224,23 @@ private static void HandleArgument( cmdDescr.Command.AddArgument(arg); - cmdDescr.Arguments.Add(new ArgumentDescriptor() - { - Argument = arg, - Property = prop, - }); + cmdDescr.Arguments.Add(new ArgumentDescriptor() { Argument = arg, Property = prop }); } private static void HandleOption( CommandDescriptor cmdDescr, OptionAttribute optAttr, - PropertyInfo prop) + PropertyInfo prop + ) { var optName = optAttr.Name ?? $"--{NameFormatter.ToKebabCase(prop.Name)}"; var optType = typeof(Option<>).MakeGenericType(prop.PropertyType); - var opt = (Option)Activator.CreateInstance( - optType, // Option value type - optName, // Option name - null)!; // Option description, we set this later + var opt = (Option) + Activator.CreateInstance( + optType, // Option value type + optName, // Option name + null // Option description, we set this later + )!; // Aliases foreach (var alias in optAttr.Aliases ?? Array.Empty()) @@ -290,10 +309,6 @@ private static void HandleOption( cmdDescr.Command.AddOption(opt); } - cmdDescr.Options.Add(new OptionDescriptor() - { - Option = opt, - Property = prop, - }); + cmdDescr.Options.Add(new OptionDescriptor() { Option = opt, Property = prop }); } -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/DefaultRootCommand.cs b/src/10-Lib/DeclarativeCommandLine/DefaultRootCommand.cs index 3305bd4..c698240 100644 --- a/src/10-Lib/DeclarativeCommandLine/DefaultRootCommand.cs +++ b/src/10-Lib/DeclarativeCommandLine/DefaultRootCommand.cs @@ -1,5 +1,3 @@ namespace DeclarativeCommandLine; -public class DefaultRootCommand -{ -} \ No newline at end of file +public class DefaultRootCommand { } diff --git a/src/10-Lib/DeclarativeCommandLine/Exceptions/DeclarativeCommandLineException.cs b/src/10-Lib/DeclarativeCommandLine/Exceptions/DeclarativeCommandLineException.cs index 421bb52..3c1071f 100644 --- a/src/10-Lib/DeclarativeCommandLine/Exceptions/DeclarativeCommandLineException.cs +++ b/src/10-Lib/DeclarativeCommandLine/Exceptions/DeclarativeCommandLineException.cs @@ -2,17 +2,11 @@ public sealed class DeclarativeCommandLineException : Exception { - public DeclarativeCommandLineException() - { - } + public DeclarativeCommandLineException() { } public DeclarativeCommandLineException(string? message) - : base(message) - { - } + : base(message) { } public DeclarativeCommandLineException(string? message, Exception? innerException) - : base(message, innerException) - { - } -} \ No newline at end of file + : base(message, innerException) { } +} diff --git a/src/10-Lib/DeclarativeCommandLine/Extensions/ServiceCollectionExtensions.cs b/src/10-Lib/DeclarativeCommandLine/Extensions/ServiceCollectionExtensions.cs index 5ce8791..5ea1eda 100644 --- a/src/10-Lib/DeclarativeCommandLine/Extensions/ServiceCollectionExtensions.cs +++ b/src/10-Lib/DeclarativeCommandLine/Extensions/ServiceCollectionExtensions.cs @@ -9,11 +9,16 @@ public static IServiceCollection AddDeclarativeCommandLine(this IServiceCollecti { return services .AddTransient() - .AddTransient(p => new DelegatingCommandFactory(type => p.GetRequiredService(type))) + .AddTransient(p => new DelegatingCommandFactory(type => + p.GetRequiredService(type) + )) .AddTransient(); } - public static IServiceCollection AddAllCommandsFromAssemblies(this IServiceCollection services, params Assembly[] assemblies) + public static IServiceCollection AddAllCommandsFromAssemblies( + this IServiceCollection services, + params Assembly[] assemblies + ) { var cmds = assemblies .SelectMany(ass => ass.GetTypes()) @@ -23,32 +28,32 @@ public static IServiceCollection AddAllCommandsFromAssemblies(this IServiceColle foreach (var cmd in cmds) { - services - .AddTransient(cmd.Type) - .AddTransient(p => cmd); + services.AddTransient(cmd.Type).AddTransient(p => cmd); } return services; } - public static IServiceCollection AddAllCommandsFromAssemblies(this IServiceCollection services, Type type) + public static IServiceCollection AddAllCommandsFromAssemblies( + this IServiceCollection services, + Type type + ) { - return services - .AddAllCommandsFromAssemblies(type.Assembly); + return services.AddAllCommandsFromAssemblies(type.Assembly); } - public static IServiceCollection AddAllCommandsFromAssemblies(this IServiceCollection services) + public static IServiceCollection AddAllCommandsFromAssemblies( + this IServiceCollection services + ) where T : class { - return services - .AddAllCommandsFromAssemblies(typeof(T).Assembly); + return services.AddAllCommandsFromAssemblies(typeof(T).Assembly); } public static IServiceCollection AddCommand(this IServiceCollection services) where T : class { - return services - .AddCommand(typeof(T)); + return services.AddCommand(typeof(T)); } public static IServiceCollection AddCommand(this IServiceCollection services, Type type) @@ -59,9 +64,7 @@ public static IServiceCollection AddCommand(this IServiceCollection services, Ty throw new InvalidOperationException($"Type '{type}' does not appear to be a command."); } - return services - .AddTransient(type) - .AddTransient(p => descr); + return services.AddTransient(type).AddTransient(p => descr); } public static async Task RunCliAsync(this IServiceProvider serviceProvider, string[] args) @@ -71,4 +74,4 @@ public static async Task RunCliAsync(this IServiceProvider serviceProvider, .InvokeAsync(args) .ConfigureAwait(false); } -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/GlobalUsings.cs b/src/10-Lib/DeclarativeCommandLine/GlobalUsings.cs index e0df01c..fd05074 100644 --- a/src/10-Lib/DeclarativeCommandLine/GlobalUsings.cs +++ b/src/10-Lib/DeclarativeCommandLine/GlobalUsings.cs @@ -6,4 +6,4 @@ global using System.Linq; global using System.Reflection; global using System.Text; -global using System.Threading.Tasks; \ No newline at end of file +global using System.Threading.Tasks; diff --git a/src/10-Lib/DeclarativeCommandLine/IAsyncCommand.cs b/src/10-Lib/DeclarativeCommandLine/IAsyncCommand.cs index dcc7471..e39f775 100644 --- a/src/10-Lib/DeclarativeCommandLine/IAsyncCommand.cs +++ b/src/10-Lib/DeclarativeCommandLine/IAsyncCommand.cs @@ -3,4 +3,4 @@ public interface IAsyncCommand { Task ExecuteAsync(); -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/ICommand.cs b/src/10-Lib/DeclarativeCommandLine/ICommand.cs index 631f6ef..b83b569 100644 --- a/src/10-Lib/DeclarativeCommandLine/ICommand.cs +++ b/src/10-Lib/DeclarativeCommandLine/ICommand.cs @@ -3,4 +3,4 @@ public interface ICommand { void Execute(); -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/ICommandFactory.cs b/src/10-Lib/DeclarativeCommandLine/ICommandFactory.cs index ffe907e..f509977 100644 --- a/src/10-Lib/DeclarativeCommandLine/ICommandFactory.cs +++ b/src/10-Lib/DeclarativeCommandLine/ICommandFactory.cs @@ -3,4 +3,4 @@ namespace DeclarativeCommandLine; public interface ICommandFactory { object? CreateCommand(Type commandType); -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/Utils/ArgumentDescriptor.cs b/src/10-Lib/DeclarativeCommandLine/Utils/ArgumentDescriptor.cs index 9954f5e..4487199 100644 --- a/src/10-Lib/DeclarativeCommandLine/Utils/ArgumentDescriptor.cs +++ b/src/10-Lib/DeclarativeCommandLine/Utils/ArgumentDescriptor.cs @@ -5,4 +5,4 @@ public class ArgumentDescriptor public Argument Argument { get; set; } public PropertyInfo Property { get; set; } -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/Utils/CommandDescriptor.cs b/src/10-Lib/DeclarativeCommandLine/Utils/CommandDescriptor.cs index a73284f..b42bf5b 100644 --- a/src/10-Lib/DeclarativeCommandLine/Utils/CommandDescriptor.cs +++ b/src/10-Lib/DeclarativeCommandLine/Utils/CommandDescriptor.cs @@ -6,7 +6,7 @@ public class CommandDescriptor { public static bool TryCreate(Type type, out CommandDescriptor? cmdDescr) { - if (type == null) throw new ArgumentNullException(nameof(type)); + ArgumentNullException.ThrowIfNull(type); cmdDescr = null; @@ -37,11 +37,7 @@ public bool IsExecutable { get { - var t = new[] - { - typeof(ICommand), - typeof(IAsyncCommand), - }; + var t = new[] { typeof(ICommand), typeof(IAsyncCommand) }; return t.Any(tt => tt.IsAssignableFrom(Type)); } @@ -58,4 +54,4 @@ public bool IsExecutable public List Arguments { get; set; } = new(); public List Options { get; set; } = new(); -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/Utils/CommandHandler.cs b/src/10-Lib/DeclarativeCommandLine/Utils/CommandHandler.cs index d1fe14f..e78f3c0 100644 --- a/src/10-Lib/DeclarativeCommandLine/Utils/CommandHandler.cs +++ b/src/10-Lib/DeclarativeCommandLine/Utils/CommandHandler.cs @@ -2,10 +2,10 @@ namespace DeclarativeCommandLine.Utils; -internal class CommandHandler( - CommandDescriptor cmdDescr) +internal class CommandHandler(CommandDescriptor cmdDescr) { - private readonly CommandDescriptor _cmdDescr = cmdDescr ?? throw new ArgumentNullException(nameof(cmdDescr)); + private readonly CommandDescriptor _cmdDescr = + cmdDescr ?? throw new ArgumentNullException(nameof(cmdDescr)); public async Task HandlerAsync(object cmdInst, InvocationContext ctx) { @@ -30,7 +30,9 @@ public async Task HandlerAsync(object cmdInst, InvocationContext ctx) return 0; } - throw new DeclarativeCommandLineException($"Type '{_cmdDescr.Type.FullName}' does not inherit from interface '{typeof(IAsyncCommand).FullName}'."); + throw new DeclarativeCommandLineException( + $"Type '{_cmdDescr.Type.FullName}' does not inherit from interface '{typeof(IAsyncCommand).FullName}'." + ); } private void HandleArguments(object cmdInst, InvocationContext ctx) @@ -50,4 +52,4 @@ private void HandleOptions(object cmdInst, InvocationContext ctx) opt1.Property.SetValue(cmdInst, optVal); } } -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/Utils/NameFormatter.cs b/src/10-Lib/DeclarativeCommandLine/Utils/NameFormatter.cs index c502349..bd803b8 100644 --- a/src/10-Lib/DeclarativeCommandLine/Utils/NameFormatter.cs +++ b/src/10-Lib/DeclarativeCommandLine/Utils/NameFormatter.cs @@ -4,17 +4,13 @@ public static class NameFormatter { public static string CommandTypeToCommandName(Type type) { - if (type == null) - { - throw new ArgumentNullException(nameof(type)); - } + ArgumentNullException.ThrowIfNull(type); var typeName = ToKebabCase(type.Name); if (typeName.EndsWith("command", StringComparison.OrdinalIgnoreCase)) { - // typeName = typeName[..^"command".Length]; - typeName = typeName.Substring(0, typeName.Length - "command".Length); + typeName = typeName[..^"command".Length]; } typeName = typeName.Trim('-'); @@ -24,10 +20,7 @@ public static string CommandTypeToCommandName(Type type) public static string ToKebabCase(string value) { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } + ArgumentNullException.ThrowIfNull(value); var sb = new StringBuilder(); @@ -45,4 +38,4 @@ public static string ToKebabCase(string value) return sb.ToString(); } -} \ No newline at end of file +} diff --git a/src/10-Lib/DeclarativeCommandLine/Utils/OptionDescriptor.cs b/src/10-Lib/DeclarativeCommandLine/Utils/OptionDescriptor.cs index bad0bac..e1e6d12 100644 --- a/src/10-Lib/DeclarativeCommandLine/Utils/OptionDescriptor.cs +++ b/src/10-Lib/DeclarativeCommandLine/Utils/OptionDescriptor.cs @@ -5,4 +5,4 @@ public class OptionDescriptor public PropertyInfo Property { get; set; } public Option Option { get; set; } -} \ No newline at end of file +} diff --git a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/AbsCommand.cs b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/AbsCommand.cs index 0762ba3..5e9c7cc 100644 --- a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/AbsCommand.cs +++ b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/AbsCommand.cs @@ -23,4 +23,4 @@ public void Execute() throw new Exception("Bleh"); } -} \ No newline at end of file +} diff --git a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/AddCommand.cs b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/AddCommand.cs index 545fd41..3166b5a 100644 --- a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/AddCommand.cs +++ b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/AddCommand.cs @@ -21,4 +21,4 @@ public void Execute() { Console.WriteLine($"{NumberA} + {NumberB} = {NumberA + NumberB}"); } -} \ No newline at end of file +} diff --git a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/DivideCommand.cs b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/DivideCommand.cs index 38b9ace..376da82 100644 --- a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/DivideCommand.cs +++ b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/DivideCommand.cs @@ -21,4 +21,4 @@ public void Execute() { Console.WriteLine($"{NumberA} + {NumberB} = {NumberA + NumberB}"); } -} \ No newline at end of file +} diff --git a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/MathCommand.cs b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/MathCommand.cs index 99cfd47..075fa74 100644 --- a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/MathCommand.cs +++ b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/MathCommand.cs @@ -1,4 +1,4 @@ namespace DeclarativeCommandLine.TestApp.Commands.Math; [Command] -public class MathCommand { } \ No newline at end of file +public class MathCommand { } diff --git a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/SubtractCommand.cs b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/SubtractCommand.cs index 679f953..923f7b6 100644 --- a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/SubtractCommand.cs +++ b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Math/SubtractCommand.cs @@ -18,4 +18,4 @@ public void Execute() { Console.WriteLine($"{ValueA} - {ValueB} = {ValueA - ValueB}"); } -} \ No newline at end of file +} diff --git a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Strings/ConcatCommand.cs b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Strings/ConcatCommand.cs index b12c942..a005a5a 100644 --- a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Strings/ConcatCommand.cs +++ b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Strings/ConcatCommand.cs @@ -7,4 +7,4 @@ public void Execute() { throw new NotImplementedException(); } -} \ No newline at end of file +} diff --git a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Strings/StringsCommand.cs b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Strings/StringsCommand.cs index 842ba8f..744214e 100644 --- a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Strings/StringsCommand.cs +++ b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/Strings/StringsCommand.cs @@ -1,4 +1,4 @@ namespace DeclarativeCommandLine.TestApp.Commands.Strings; [Command] -public class StringsCommand { } \ No newline at end of file +public class StringsCommand { } diff --git a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/TestRootCommand.cs b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/TestRootCommand.cs index ed7eb02..2fe1d27 100644 --- a/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/TestRootCommand.cs +++ b/src/20-TestApp/DeclarativeCommandLine.TestApp/Commands/TestRootCommand.cs @@ -7,4 +7,4 @@ public TestRootCommand() { Console.WriteLine($"new {GetType().FullName}()"); } -} \ No newline at end of file +} diff --git a/src/20-TestApp/DeclarativeCommandLine.TestApp/GlobalUsings.cs b/src/20-TestApp/DeclarativeCommandLine.TestApp/GlobalUsings.cs index 118f71e..0c8a168 100644 --- a/src/20-TestApp/DeclarativeCommandLine.TestApp/GlobalUsings.cs +++ b/src/20-TestApp/DeclarativeCommandLine.TestApp/GlobalUsings.cs @@ -1,2 +1,2 @@ +global using System; global using DeclarativeCommandLine.Attributes; -global using System; \ No newline at end of file diff --git a/src/20-TestApp/DeclarativeCommandLine.TestApp/Program.cs b/src/20-TestApp/DeclarativeCommandLine.TestApp/Program.cs index d58449c..b5c4f5e 100644 --- a/src/20-TestApp/DeclarativeCommandLine.TestApp/Program.cs +++ b/src/20-TestApp/DeclarativeCommandLine.TestApp/Program.cs @@ -1,7 +1,7 @@ -using DeclarativeCommandLine.Extensions; +using System.Threading.Tasks; +using DeclarativeCommandLine.Extensions; using DeclarativeCommandLine.TestApp.Commands; using Microsoft.Extensions.DependencyInjection; -using System.Threading.Tasks; namespace DeclarativeCommandLine.TestApp; @@ -14,4 +14,4 @@ public static async Task Main(string[] args) => .BuildServiceProvider() .RunCliAsync(args) .ConfigureAwait(false); -} \ No newline at end of file +} diff --git a/src/DeclarativeCommandLine.sln b/src/DeclarativeCommandLine.sln index 59b2c43..10a109d 100644 --- a/src/DeclarativeCommandLine.sln +++ b/src/DeclarativeCommandLine.sln @@ -15,7 +15,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "00-Sln", "00-Sln", "{E5052D Directory.Build.props = Directory.Build.props Directory.Packages.props = Directory.Packages.props global.json = global.json - stylecop.json = stylecop.json ..\.editorconfig = ..\.editorconfig ..\.gitattributes = ..\.gitattributes ..\.gitignore = ..\.gitignore diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 97ee47c..ea7edb2 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -11,7 +11,6 @@ true true - true @@ -28,11 +27,6 @@ true - - - - - false @@ -41,15 +35,15 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 8a60269..ed09c6c 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -3,16 +3,16 @@ true - - + + + - - - + + \ No newline at end of file diff --git a/src/stylecop.json b/src/stylecop.json deleted file mode 100644 index af3e7f1..0000000 --- a/src/stylecop.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", - - "settings": { - "documentationRules": { - "companyName": "", - "documentationCulture": "", - "documentExposedElements": true, - "documentInterfaces": true, - "documentInternalElements": true, - "documentPrivateElements": true, - "documentPrivateFields": true, - "excludeFromPunctuationCheck": [], - "fileNamingConvention": "stylecop", - "headerDecoration": "", - "variables": {}, - "xmlHeader": true - }, - "indentation": { - "indentationSize": 4, - "tabSize": 4, - "useTabs": true - }, - "layoutRules": { - "allowConsecutiveUsings": true, - "allowDoWhileOnClosingBrace": true, - "newlineAtEndOfFile": "omit" - }, - "maintainabilityRules": { - "topLevelTypes": [ "class" ] - }, - "namingRules": { - "allowCommonHungarianPrefixes": false, - "allowedHungarianPrefixes": [], - "allowedNamespaceComponents": [], - "includeInferredTupleElementNames": true, - "tupleElementNameCasing": "PascalCase" - }, - "orderingRules": { - "blankLinesBetweenUsingGroups": "omit", - "elementOrder": [ "kind", "accessibility", "constant", "static", "readonly" ], - "systemUsingDirectivesFirst": false, - "usingDirectivesPlacement": "outsideNamespace" - }, - "readabilityRules": { - "allowBuiltInTypeAliases": true - }, - "spacingRules": { - } - } -} \ No newline at end of file