diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index f24b4ac..c62edc8 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -3,7 +3,7 @@
"isRoot": true,
"tools": {
"dotnet-reportgenerator-globaltool": {
- "version": "5.5.4",
+ "version": "5.5.9",
"commands": [
"reportgenerator"
],
diff --git a/.editorconfig b/.editorconfig
index 322d8cd..3fb61cd 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,30 +1,38 @@
-# Remove the line below if you want to inherit .editorconfig settings from higher directories
-# @see: https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/code-style-rule-options
root = true
+# All files
[*]
-# New line preferences
-end_of_line = crlf
+indent_style = space
-[*.{json,graphql,css}]
+# Xml files
+[*.xml]
+indent_size = 2
+
+# Xml project files
+[*.{csproj,fsproj,vbproj,proj,slnx}]
+indent_size = 2
+
+# Xml config files
+[*.{props,targets,config,nuspec}]
+indent_size = 2
+
+[*.json]
indent_size = 2
-indent_style = space
-tab_width = 2
-# C# / Razor files
+# C# files
[*.cs]
#### Core EditorConfig Options ####
# Indentation and spacing
indent_size = 4
-indent_style = space
tab_width = 4
# New line preferences
-insert_final_newline = true
+insert_final_newline = false
#### .NET Coding Conventions ####
+[*.{cs,vb}]
# Organize usings
dotnet_separate_import_directive_groups = false
@@ -32,123 +40,114 @@ 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
+dotnet_style_qualification_for_event = false:silent
+dotnet_style_qualification_for_field = false:silent
+dotnet_style_qualification_for_method = false:silent
+dotnet_style_qualification_for_property = false:silent
# Language keywords vs BCL types preferences
-dotnet_style_predefined_type_for_locals_parameters_members = true
-dotnet_style_predefined_type_for_member_access = true
+dotnet_style_predefined_type_for_locals_parameters_members = true:silent
+dotnet_style_predefined_type_for_member_access = true:silent
# 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
+dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
# Modifier preferences
-dotnet_style_require_accessibility_modifiers = for_non_interface_members
+dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
# 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_coalesce_expression = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_namespace_match_folder = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+dotnet_style_object_initializer = true:suggestion
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
+dotnet_style_prefer_auto_properties = true:suggestion
+dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
+dotnet_style_prefer_compound_assignment = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
+dotnet_style_prefer_conditional_expression_over_return = true:suggestion
+dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
+dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
+dotnet_style_prefer_simplified_interpolation = true:suggestion
# Field preferences
-dotnet_style_readonly_field = true
+dotnet_style_readonly_field = true:warning
# Parameter preferences
-dotnet_code_quality_unused_parameters = all:silent
+dotnet_code_quality_unused_parameters = all:suggestion
# 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 ####
+[*.cs]
# var preferences
-csharp_style_var_elsewhere = true
-csharp_style_var_for_built_in_types = true
-csharp_style_var_when_type_is_apparent = true
+csharp_style_var_elsewhere = true:silent
+csharp_style_var_for_built_in_types = true:silent
+csharp_style_var_when_type_is_apparent = true:silent
# 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 = true
-csharp_style_expression_bodied_methods = true
-csharp_style_expression_bodied_operators = true
-csharp_style_expression_bodied_properties = true
+csharp_style_expression_bodied_accessors = true:silent
+csharp_style_expression_bodied_constructors = false:silent
+csharp_style_expression_bodied_indexers = true:silent
+csharp_style_expression_bodied_lambdas = true:suggestion
+csharp_style_expression_bodied_local_functions = true:silent
+csharp_style_expression_bodied_methods = true:silent
+csharp_style_expression_bodied_operators = true:silent
+csharp_style_expression_bodied_properties = true:silent
# 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
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_prefer_extended_property_pattern = true:suggestion
+csharp_style_prefer_not_pattern = true:suggestion
+csharp_style_prefer_pattern_matching = true:silent
+csharp_style_prefer_switch_expression = true:suggestion
# Null-checking preferences
-csharp_style_conditional_delegate_call = true
+csharp_style_conditional_delegate_call = true:suggestion
# 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
+csharp_prefer_static_anonymous_function = true:suggestion
+csharp_prefer_static_local_function = true:warning
+csharp_preferred_modifier_order = public, private, protected, internal, file, const, static, extern, new, virtual, abstract, sealed, override, readonly, unsafe, required, volatile, async:suggestion
+csharp_style_prefer_readonly_struct = true:suggestion
+csharp_style_prefer_readonly_struct_member = true:suggestion
# Code-block preferences
-csharp_prefer_braces = when_multiline
-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
+csharp_prefer_braces = when_multiline:silent
+csharp_prefer_simple_using_statement = true:suggestion
+csharp_style_namespace_declarations = file_scoped:suggestion
+csharp_style_prefer_method_group_conversion = true:silent
+csharp_style_prefer_primary_constructors = true:suggestion
+csharp_style_prefer_top_level_statements = true:silent
# 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
+csharp_prefer_simple_default_expression = true:suggestion
+csharp_style_deconstructed_variable_declaration = true:suggestion
+csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+csharp_style_prefer_index_operator = true:suggestion
+csharp_style_prefer_local_over_anonymous_function = true:suggestion
+csharp_style_prefer_null_check_over_type_check = true:suggestion
+csharp_style_prefer_range_operator = true:suggestion
+csharp_style_prefer_tuple_swap = true:suggestion
+csharp_style_prefer_utf8_string_literals = true:suggestion
+csharp_style_throw_expression = true:suggestion
+csharp_style_unused_value_assignment_preference = discard_variable:suggestion
+csharp_style_unused_value_expression_statement_preference = discard_variable:silent
# 'using' directive preferences
-csharp_using_directive_placement = outside_namespace
-
-# 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
+csharp_using_directive_placement = outside_namespace:silent
#### C# Formatting Rules ####
@@ -198,89 +197,195 @@ csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = true
#### Naming styles ####
+[*.{cs,vb}]
# Naming rules
-dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
-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_and_namespaces_should_be_pascalcase.severity = suggestion
+dotnet_naming_rule.types_and_namespaces_should_be_pascalcase.symbols = types_and_namespaces
+dotnet_naming_rule.types_and_namespaces_should_be_pascalcase.style = pascalcase
+
+dotnet_naming_rule.interfaces_should_be_ipascalcase.severity = suggestion
+dotnet_naming_rule.interfaces_should_be_ipascalcase.symbols = interfaces
+dotnet_naming_rule.interfaces_should_be_ipascalcase.style = ipascalcase
+
+dotnet_naming_rule.type_parameters_should_be_tpascalcase.severity = suggestion
+dotnet_naming_rule.type_parameters_should_be_tpascalcase.symbols = type_parameters
+dotnet_naming_rule.type_parameters_should_be_tpascalcase.style = tpascalcase
+
+dotnet_naming_rule.methods_should_be_pascalcase.severity = suggestion
+dotnet_naming_rule.methods_should_be_pascalcase.symbols = methods
+dotnet_naming_rule.methods_should_be_pascalcase.style = pascalcase
+
+dotnet_naming_rule.properties_should_be_pascalcase.severity = suggestion
+dotnet_naming_rule.properties_should_be_pascalcase.symbols = properties
+dotnet_naming_rule.properties_should_be_pascalcase.style = pascalcase
+
+dotnet_naming_rule.events_should_be_pascalcase.severity = suggestion
+dotnet_naming_rule.events_should_be_pascalcase.symbols = events
+dotnet_naming_rule.events_should_be_pascalcase.style = pascalcase
+
+dotnet_naming_rule.local_variables_should_be_camelcase.severity = suggestion
+dotnet_naming_rule.local_variables_should_be_camelcase.symbols = local_variables
+dotnet_naming_rule.local_variables_should_be_camelcase.style = camelcase
+
+dotnet_naming_rule.local_constants_should_be_camelcase.severity = suggestion
+dotnet_naming_rule.local_constants_should_be_camelcase.symbols = local_constants
+dotnet_naming_rule.local_constants_should_be_camelcase.style = camelcase
+
+dotnet_naming_rule.parameters_should_be_camelcase.severity = suggestion
+dotnet_naming_rule.parameters_should_be_camelcase.symbols = parameters
+dotnet_naming_rule.parameters_should_be_camelcase.style = camelcase
+
+dotnet_naming_rule.public_fields_should_be_pascalcase.severity = suggestion
+dotnet_naming_rule.public_fields_should_be_pascalcase.symbols = public_fields
+dotnet_naming_rule.public_fields_should_be_pascalcase.style = pascalcase
-dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
-dotnet_naming_rule.types_should_be_pascal_case.symbols = types
-dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
+dotnet_naming_rule.private_fields_should_be__camelcase.severity = suggestion
+dotnet_naming_rule.private_fields_should_be__camelcase.symbols = private_fields
+dotnet_naming_rule.private_fields_should_be__camelcase.style = _camelcase
-dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
-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
+dotnet_naming_rule.private_static_fields_should_be_s_camelcase.severity = suggestion
+dotnet_naming_rule.private_static_fields_should_be_s_camelcase.symbols = private_static_fields
+dotnet_naming_rule.private_static_fields_should_be_s_camelcase.style = s_camelcase
-## Define the 'private_fields_should_be_underscored' naming rule
-dotnet_naming_rule.private_fields_should_be_underscored.severity = suggestion
-dotnet_naming_rule.private_fields_should_be_underscored.symbols = private_fields
-dotnet_naming_rule.private_fields_should_be_underscored.style = underscored
+dotnet_naming_rule.public_constant_fields_should_be_pascalcase.severity = suggestion
+dotnet_naming_rule.public_constant_fields_should_be_pascalcase.symbols = public_constant_fields
+dotnet_naming_rule.public_constant_fields_should_be_pascalcase.style = pascalcase
-## Define the 'private_static_fields_should_be_underscored' naming rule
-dotnet_naming_rule.private_static_fields_should_be_underscored.severity = suggestion
-dotnet_naming_rule.private_static_fields_should_be_underscored.symbols = private_static_fields
-dotnet_naming_rule.private_static_fields_should_be_underscored.style = underscored
+dotnet_naming_rule.private_constant_fields_should_be_pascalcase.severity = suggestion
+dotnet_naming_rule.private_constant_fields_should_be_pascalcase.symbols = private_constant_fields
+dotnet_naming_rule.private_constant_fields_should_be_pascalcase.style = pascalcase
-## Define the 'private_constants_should_be_underscored' naming rule
-dotnet_naming_rule.private_constants_should_be_underscored.severity = suggestion
-dotnet_naming_rule.private_constants_should_be_underscored.symbols = private_constants
-dotnet_naming_rule.private_constants_should_be_underscored.style = underscored
+dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.severity = suggestion
+dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.symbols = public_static_readonly_fields
+dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.style = pascalcase
-## Define the 'public_constants_should_be_pascal_case' naming rule
-dotnet_naming_rule.public_constants_should_be_pascal_case.severity = suggestion
-dotnet_naming_rule.public_constants_should_be_pascal_case.symbols = public_constants
-dotnet_naming_rule.public_constants_should_be_pascal_case.style = pascal_case
+dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.severity = suggestion
+dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.symbols = private_static_readonly_fields
+dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.style = pascalcase
+
+dotnet_naming_rule.enums_should_be_pascalcase.severity = suggestion
+dotnet_naming_rule.enums_should_be_pascalcase.symbols = enums
+dotnet_naming_rule.enums_should_be_pascalcase.style = pascalcase
+
+dotnet_naming_rule.local_functions_should_be_pascalcase.severity = suggestion
+dotnet_naming_rule.local_functions_should_be_pascalcase.symbols = local_functions
+dotnet_naming_rule.local_functions_should_be_pascalcase.style = pascalcase
+
+dotnet_naming_rule.non_field_members_should_be_pascalcase.severity = suggestion
+dotnet_naming_rule.non_field_members_should_be_pascalcase.symbols = non_field_members
+dotnet_naming_rule.non_field_members_should_be_pascalcase.style = pascalcase
# 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.interfaces.applicable_kinds = interface
+dotnet_naming_symbols.interfaces.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.interfaces.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.enums.applicable_kinds = enum
+dotnet_naming_symbols.enums.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.enums.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 =
+dotnet_naming_symbols.events.applicable_kinds = event
+dotnet_naming_symbols.events.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.events.required_modifiers =
+
+dotnet_naming_symbols.methods.applicable_kinds = method
+dotnet_naming_symbols.methods.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.methods.required_modifiers =
+
+dotnet_naming_symbols.properties.applicable_kinds = property
+dotnet_naming_symbols.properties.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.properties.required_modifiers =
+
+dotnet_naming_symbols.public_fields.applicable_kinds = field
+dotnet_naming_symbols.public_fields.applicable_accessibilities = public, internal
+dotnet_naming_symbols.public_fields.required_modifiers =
-## Define the 'private_fields' symbol group
dotnet_naming_symbols.private_fields.applicable_kinds = field
-dotnet_naming_symbols.private_fields.applicable_accessibilities = private
+dotnet_naming_symbols.private_fields.applicable_accessibilities = private, protected, protected_internal, private_protected
+dotnet_naming_symbols.private_fields.required_modifiers =
-## Define the 'private_static_fields' symbol group
dotnet_naming_symbols.private_static_fields.applicable_kinds = field
-dotnet_naming_symbols.private_static_fields.applicable_accessibilities = private
+dotnet_naming_symbols.private_static_fields.applicable_accessibilities = private, protected, protected_internal, private_protected
dotnet_naming_symbols.private_static_fields.required_modifiers = static
-## Define the 'private_constants' symbol group
-dotnet_naming_symbols.private_constants.applicable_kinds = field
-dotnet_naming_symbols.private_constants.applicable_accessibilities = private
-dotnet_naming_symbols.private_constants.required_modifiers = const
+dotnet_naming_symbols.types_and_namespaces.applicable_kinds = namespace, class, struct, interface, enum
+dotnet_naming_symbols.types_and_namespaces.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.types_and_namespaces.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 =
+
+dotnet_naming_symbols.type_parameters.applicable_kinds = namespace
+dotnet_naming_symbols.type_parameters.applicable_accessibilities = *
+dotnet_naming_symbols.type_parameters.required_modifiers =
+
+dotnet_naming_symbols.private_constant_fields.applicable_kinds = field
+dotnet_naming_symbols.private_constant_fields.applicable_accessibilities = private, protected, protected_internal, private_protected
+dotnet_naming_symbols.private_constant_fields.required_modifiers = const
+
+dotnet_naming_symbols.local_variables.applicable_kinds = local
+dotnet_naming_symbols.local_variables.applicable_accessibilities = local
+dotnet_naming_symbols.local_variables.required_modifiers =
+
+dotnet_naming_symbols.local_constants.applicable_kinds = local
+dotnet_naming_symbols.local_constants.applicable_accessibilities = local
+dotnet_naming_symbols.local_constants.required_modifiers = const
+
+dotnet_naming_symbols.parameters.applicable_kinds = parameter
+dotnet_naming_symbols.parameters.applicable_accessibilities = *
+dotnet_naming_symbols.parameters.required_modifiers =
-## Define the 'public_constants' symbol group
-dotnet_naming_symbols.public_constants.applicable_kinds = field
-dotnet_naming_symbols.public_constants.applicable_accessibilities = public
-dotnet_naming_symbols.public_constants.required_modifiers = const
+dotnet_naming_symbols.public_constant_fields.applicable_kinds = field
+dotnet_naming_symbols.public_constant_fields.applicable_accessibilities = public, internal
+dotnet_naming_symbols.public_constant_fields.required_modifiers = const
+
+dotnet_naming_symbols.public_static_readonly_fields.applicable_kinds = field
+dotnet_naming_symbols.public_static_readonly_fields.applicable_accessibilities = public, internal
+dotnet_naming_symbols.public_static_readonly_fields.required_modifiers = readonly, static
+
+dotnet_naming_symbols.private_static_readonly_fields.applicable_kinds = field
+dotnet_naming_symbols.private_static_readonly_fields.applicable_accessibilities = private, protected, protected_internal, private_protected
+dotnet_naming_symbols.private_static_readonly_fields.required_modifiers = readonly, static
+
+dotnet_naming_symbols.local_functions.applicable_kinds = local_function
+dotnet_naming_symbols.local_functions.applicable_accessibilities = *
+dotnet_naming_symbols.local_functions.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.pascalcase.required_prefix =
+dotnet_naming_style.pascalcase.required_suffix =
+dotnet_naming_style.pascalcase.word_separator =
+dotnet_naming_style.pascalcase.capitalization = pascal_case
+
+dotnet_naming_style.ipascalcase.required_prefix = I
+dotnet_naming_style.ipascalcase.required_suffix =
+dotnet_naming_style.ipascalcase.word_separator =
+dotnet_naming_style.ipascalcase.capitalization = pascal_case
+
+dotnet_naming_style.tpascalcase.required_prefix = T
+dotnet_naming_style.tpascalcase.required_suffix =
+dotnet_naming_style.tpascalcase.word_separator =
+dotnet_naming_style.tpascalcase.capitalization = pascal_case
+
+dotnet_naming_style._camelcase.required_prefix = _
+dotnet_naming_style._camelcase.required_suffix =
+dotnet_naming_style._camelcase.word_separator =
+dotnet_naming_style._camelcase.capitalization = camel_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
+dotnet_naming_style.camelcase.required_prefix =
+dotnet_naming_style.camelcase.required_suffix =
+dotnet_naming_style.camelcase.word_separator =
+dotnet_naming_style.camelcase.capitalization = camel_case
-## Define the 'underscored' naming style
-dotnet_naming_style.underscored.capitalization = camel_case
-dotnet_naming_style.underscored.required_prefix = _
+dotnet_naming_style.s_camelcase.required_prefix = s_
+dotnet_naming_style.s_camelcase.required_suffix =
+dotnet_naming_style.s_camelcase.word_separator =
+dotnet_naming_style.s_camelcase.capitalization = camel_case
# ReSharper
resharper_arrange_object_creation_when_type_not_evident_highlighting = none
@@ -304,4 +409,4 @@ resharper_csharp_wrap_chained_method_calls = chop_if_long
resharper_csharp_wrap_before_first_method_call = true
resharper_csharp_wrap_after_property_in_chained_method_calls = true
resharper_csharp_indent_raw_literal_string = do_not_change
-resharper_csharp_max_line_length = 200
\ No newline at end of file
+resharper_csharp_max_line_length = 240
\ No newline at end of file
diff --git a/DataAnnotatedModelValidations.Tests/DataAnnotatedModelValidations.Tests.csproj b/DataAnnotatedModelValidations.Tests/DataAnnotatedModelValidations.Tests.csproj
index a34aea0..1df2d6c 100644
--- a/DataAnnotatedModelValidations.Tests/DataAnnotatedModelValidations.Tests.csproj
+++ b/DataAnnotatedModelValidations.Tests/DataAnnotatedModelValidations.Tests.csproj
@@ -15,18 +15,18 @@
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
@@ -34,7 +34,7 @@
-
+
diff --git a/DataAnnotatedModelValidations.Tests/DataAnnotationsValidatorRegistrationTests.cs b/DataAnnotatedModelValidations.Tests/DataAnnotationsValidatorRegistrationTests.cs
index bbe0086..6b37e34 100644
--- a/DataAnnotatedModelValidations.Tests/DataAnnotationsValidatorRegistrationTests.cs
+++ b/DataAnnotatedModelValidations.Tests/DataAnnotationsValidatorRegistrationTests.cs
@@ -13,4 +13,4 @@ public void AddDataAnnotationsValidator_Should_Add_Interceptor_To_GraphQLBuilder
// Interceptor + Previous
Assert.Equal(count + 1, requestExecutorBuilder.Services.Count);
}
-}
+}
\ No newline at end of file
diff --git a/DataAnnotatedModelValidations.Tests/Extensions/CollectionExtensionsTests.cs b/DataAnnotatedModelValidations.Tests/Extensions/CollectionExtensionsTests.cs
index c297478..6a92955 100644
--- a/DataAnnotatedModelValidations.Tests/Extensions/CollectionExtensionsTests.cs
+++ b/DataAnnotatedModelValidations.Tests/Extensions/CollectionExtensionsTests.cs
@@ -7,4 +7,4 @@ public class CollectionExtensionsTests
[Fact]
public void AsEnumerable_Should_Enumerate_Once() =>
Assert.Single("test".AsEnumerable().Take(10));
-}
+}
\ No newline at end of file
diff --git a/DataAnnotatedModelValidations.Tests/Extensions/ReportingExtensionsTests.cs b/DataAnnotatedModelValidations.Tests/Extensions/ReportingExtensionsTests.cs
deleted file mode 100644
index db51a8a..0000000
--- a/DataAnnotatedModelValidations.Tests/Extensions/ReportingExtensionsTests.cs
+++ /dev/null
@@ -1,123 +0,0 @@
-using DataAnnotatedModelValidations.Extensions;
-
-namespace DataAnnotatedModelValidations.Tests.Extensions;
-
-public class ReportingExtensionsTests
-{
- private readonly IInputField _argument;
-
- public ReportingExtensionsTests()
- {
- _argument = Substitute.For();
- _argument.Name.Returns("Name");
- }
-
- [Fact]
- public void GetNormalizedMemberName_Should_Normalize_Value() =>
- Assert.Equal("helloWorld_0_", "HelloWorld[0]".GetNormalizedMemberName());
-
- [Fact]
- public void ToTokenizedMemberNames_Should_Tokenize_Value() =>
- Assert.Equal(
- [
- "hello",
- "world"
- ],
- "hello:world".ToTokenizedMemberNames()
- );
-
- [Fact]
- public void ToComposedMemberNames_Should_Enumerate_Name_When_MemberName_Is_Null() =>
- Assert.Equal(["Name"], _argument.ToComposedMemberNames(default, default));
-
- [Fact]
- public void ToComposedMemberNames_Should_Enumerate_Name_When_MemberName_Is_Blank() =>
- Assert.Equal(["Name"], _argument.ToComposedMemberNames(" ", default));
-
- [Fact]
- public void ToComposedMemberNames_Should_Enumerate_MemberName_And_Name_When_ValueValidation_Is_Not_True() =>
- Assert.Equal(
- [
- "Name",
- "hello",
- "world_0_"
- ],
- _argument.ToComposedMemberNames("Hello:World[0]", default)
- );
-
- [Fact]
- public void ToComposedMemberNames_Should_Enumerate_MemberName_When_ValueValidation_Is_True() =>
- Assert.Equal(
- [
- "hello",
- "world_0_"
- ],
- _argument.ToComposedMemberNames("Hello:World[0]", true)
- );
-
- [Fact]
- public void ToArgumentPath_Should_Produce_Path()
- {
- var result = new[] { "hello" }.ToArgumentPath(["world"]);
-
- Assert.Equal(
- Path.Root.Append("hello").Append("world"),
- result
- );
- }
-
- [Fact]
- public void ReportError_Should_Report_With_Code_Path_And_Message_When_Message_Not_Null()
- {
- var context = Substitute.For();
-
- context.ReportError(
- _argument,
- ["hello"],
- default,
- "world",
- default
- );
-
- var receivedArguments = context.ReceivedCalls().SelectMany(x => x.GetArguments()).ToArray();
-
- Assert.Single(
- receivedArguments,
- x =>
- x is Error
- {
- Code: ReportingConsts.GenericErrorCode,
- Message: "world",
- Path: { Length: 2 } p
- }
- && p.Equals(Path.Root.Append("hello").Append("Name"))
- );
- }
-
- [Fact]
- public void ReportError_Should_Report_With_Code_Path_And_Default_Message_When_Message_Null()
- {
- var context = Substitute.For();
-
- context.ReportError(
- _argument,
- ["hello"],
- default,
- default,
- "member"
- );
-
- var receivedArguments = context.ReceivedCalls().SelectMany(x => x.GetArguments()).ToArray();
-
- Assert.Single(
- receivedArguments,
- x => x is Error
- {
- Code: ReportingConsts.GenericErrorCode,
- Message: ReportingConsts.GenericErrorMessage,
- Path: { Length: 3 } p
- }
- && p.Equals(Path.Root.Append("hello").Append("Name").Append("member"))
- );
- }
-}
diff --git a/DataAnnotatedModelValidations.Tests/Extensions/StringExtensionsTests.cs b/DataAnnotatedModelValidations.Tests/Extensions/StringExtensionsTests.cs
index 9484a61..9ed22fa 100644
--- a/DataAnnotatedModelValidations.Tests/Extensions/StringExtensionsTests.cs
+++ b/DataAnnotatedModelValidations.Tests/Extensions/StringExtensionsTests.cs
@@ -20,4 +20,4 @@ public class StringExtensionsTests
[InlineData("F", "f")]
public void GetCamelCaseName(string input, string expected) =>
Assert.Equal(expected, input.Camelize());
-}
+}
\ No newline at end of file
diff --git a/DataAnnotatedModelValidations.Tests/Extensions/ValidationExtensionsTests.cs b/DataAnnotatedModelValidations.Tests/Extensions/ValidationExtensionsTests.cs
deleted file mode 100644
index 741f575..0000000
--- a/DataAnnotatedModelValidations.Tests/Extensions/ValidationExtensionsTests.cs
+++ /dev/null
@@ -1,159 +0,0 @@
-using DataAnnotatedModelValidations.Extensions;
-
-namespace DataAnnotatedModelValidations.Tests.Extensions;
-
-public class ValidationExtensionsTests
-{
- private readonly IMiddlewareContext _mockContext;
-
- public ValidationExtensionsTests()
- {
- _mockContext = Substitute.For();
- _mockContext.Path.Returns(Path.Root.Append("path"));
- }
-
- [Fact]
- public void ValidateInputs_Should_Not_Report_Error_When_Field_ContextKey_Is_Not_Set()
- {
- _mockContext.Selection.Field.ContextData.ContainsKey(Arg.Any()).Returns(false);
-
- _mockContext.ValidateInputs();
-
- Assert.DoesNotContain(_mockContext.ReceivedCalls(), x => x.GetMethodInfo().Name == "ReportError");
- }
-
- [Fact]
- public void ValidateInputs_Should_Not_Report_Error_When_Field_ContextKey_Is_Set_And_Arguments_Is_Null()
- {
- _mockContext.Selection.Field.ContextData.ContainsKey(Arg.Any()).Returns(true);
- _mockContext.Selection.Field.Arguments.Returns(default(IFieldCollection?)!);
-
- _mockContext.ValidateInputs();
-
- Assert.DoesNotContain(_mockContext.ReceivedCalls(), x => x.GetMethodInfo().Name == "ReportError");
- }
-
- [Fact]
- public void ValidateInputs_Should_Not_Report_Error_When_Field_ContextKey_Is_Set_And_No_Arguments_Present()
- {
- _mockContext.Selection.Field.ContextData.ContainsKey(Arg.Any()).Returns(true);
- _mockContext.Selection.Field.Arguments.Returns(FieldCollection.Empty);
-
- _mockContext.ValidateInputs();
-
- Assert.DoesNotContain(_mockContext.ReceivedCalls(), x => x.GetMethodInfo().Name == "ReportError");
- }
-
- [Fact]
- public void ValidateInputs_Should_Not_Report_Error_When_Field_ContextKey_Is_Set_And_All_Arguments_Are_Null()
- {
- _mockContext.Selection.Field.ContextData.ContainsKey(Arg.Any()).Returns(true);
- var collection = Substitute.For>();
- using var collectionEnumerator = collection.GetEnumerator();
- using var mockEnumerator = MockEnumerator(null!, null!, null!).GetEnumerator();
- collectionEnumerator.Returns(mockEnumerator);
- collection.Count.Returns(3);
- _mockContext.Selection.Field.Arguments.Returns(collection);
-
- _mockContext.ValidateInputs();
-
- Assert.DoesNotContain(_mockContext.ReceivedCalls(), x => x.GetMethodInfo().Name == "ReportError");
- }
-
- [Fact]
- public void ValidateInputs_Should_Not_Report_Error_When_Field_ContextKey_Is_Set_And_No_Arguments_Has_ContextKey_Set()
- {
- _mockContext.Selection.Field.ContextData.ContainsKey(Arg.Any()).Returns(true);
- var argument = Substitute.For();
- argument.Name.Returns("sampleArgument");
- argument.ContextData.ContainsKey(Arg.Any()).Returns(false);
- var collection = Substitute.For>();
- using var collectionEnumerator = collection.GetEnumerator();
- using var mockEnumerator = MockEnumerator(argument).GetEnumerator();
- collectionEnumerator.Returns(mockEnumerator);
- collection.Count.Returns(1);
- _mockContext.Selection.Field.Arguments.Returns(collection);
-
- _mockContext.ValidateInputs();
-
- Assert.DoesNotContain(_mockContext.ReceivedCalls(), x => x.GetMethodInfo().Name == "ReportError");
- }
-
- [Fact]
- public void ValidateInputs_Should_Not_Report_Error_When_Field_ContextKey_Is_Set_And_Context_Returns_Null_For_Argument()
- {
- _mockContext.Selection.Field.ContextData.ContainsKey(Arg.Any()).Returns(true);
- var argument = Substitute.For();
- argument.Name.Returns("sampleArgument");
- argument.ContextData.ContainsKey(Arg.Any()).Returns(true);
- var collection = Substitute.For>();
- using var collectionEnumerator = collection.GetEnumerator();
- using var mockEnumerator = MockEnumerator(argument).GetEnumerator();
- collectionEnumerator.Returns(mockEnumerator);
- collection.Count.Returns(1);
- _mockContext.Selection.Field.Arguments.Returns(collection);
- _mockContext.ArgumentValue