# All rules here : https://realm.github.io/SwiftLint/rule-directory.html

analyzer_rules:
  - capture_variable
  - typesafe_array_init
  - unused_declaration
  - unused_import

included:
  - Sources

## Rules configuration

attributes:
  always_on_line_above: ["@InjectedValue", "@ViewBuilder", "@IBOutlet"]
  always_on_same_line: ["@Environment", "@EnvironmentObject", "@StateObject", "@State"]

identifier_name:
  min_length:
    - 2
  max_length:
    - 60
  excluded:
    - x
    - y

type_name:
  min_length: 3
  max_length: 60
  excluded:
    - T
  allowed_symbols:
    - _

# line_length:
#   warning: 150

disabled_rules:
  - blanket_disable_command # do not warn when rule is not re-enable later in the file
  - type_contents_order
  - legacy_objc_type
  - indentation_width
  - function_parameter_count
  - line_length
  - function_body_length
  - cyclomatic_complexity
  - optional_data_string_conversion

opt_in_rules:
  # Default rules :
  - block_based_kvo
  - class_delegate_protocol
  - closing_brace
  - closure_parameter_position
  - colon
  - comma
  - comment_spacing
  - compiler_protocol_init
  - computed_accessors_order
  - control_statement
  - custom_rules
  # - cyclomatic_complexity
  - deployment_target
  - discouraged_direct_init
  - duplicate_enum_cases
  - duplicate_imports
  - duplicated_key_in_dictionary_literal
  - dynamic_inline
  - empty_enum_arguments
  - empty_parameters
  - empty_parentheses_with_trailing_closure
  - file_length
  - for_where
  - force_unwrapping
  - force_cast
  - force_try
  - trailing_whitespace
  # - function_body_length
  # - function_parameter_count
  - generic_type_name
  - identifier_name
  - implicit_getter
  - inclusive_language
  - is_disjoint
  - large_tuple
  - leading_whitespace
  - legacy_cggeometry_functions
  - legacy_constant
  - legacy_constructor
  - legacy_hashing
  - legacy_nsgeometry_functions
  - legacy_random
  # - line_length
  - mark
  - multiple_closures_with_trailing_closure
  - nesting
  - no_fallthrough_only
  - no_space_in_method_call
  - notification_center_detachment
  - ns_number_init_as_function_reference
  - nsobject_prefer_isequal
  - opening_brace
  - operator_whitespace
  - orphaned_doc_comment
  - private_over_fileprivate
  - private_unit_test
  - protocol_property_accessors_order
  - reduce_boolean
  - redundant_discardable_let
  - redundant_objc_attribute
  - redundant_optional_initialization
  - redundant_set_access_control
  - redundant_string_enum_value
  - redundant_void_return
  - return_arrow_whitespace
  - self_in_property_initialization
  - shorthand_operator
  - statement_position
  - superfluous_disable_command
  - switch_case_alignment
  - syntactic_sugar
  - todo
  - trailing_comma
  - trailing_newline
  - trailing_semicolon
  - type_body_length
  - type_name
  - unavailable_condition
  - unneeded_break_in_switch
  - unused_closure_parameter
  - unused_control_flow_label
  - unused_enumerated
  - unused_optional_binding
  - unused_setter_value
  - valid_ibinspectable
  - vertical_parameter_alignment
  - vertical_whitespace
  - void_function_in_ternary
  - void_return
  - xctfail_message
  - accessibility_trait_for_button
  - array_init
  - attributes
  - closure_body_length
  - closure_end_indentation
  - closure_spacing
  - collection_alignment
  - comma_inheritance
  - contains_over_filter_count
  - contains_over_filter_is_empty
  - contains_over_first_not_nil
  - contains_over_range_nil_comparison
  - convenience_type
  - discarded_notification_center_observer
  - discouraged_assert
  - empty_count
  - empty_string
  - empty_xctest_method
  - enum_case_associated_values_count
  - explicit_init
  - fallthrough
  - fatal_error_message
  - file_header
  - first_where
  - flatmap_over_map_reduce
  - ibinspectable_in_extension
  - implicit_return
  - implicitly_unwrapped_optional
  - joined_default_parameter
  - last_where
  - legacy_multiple
  - let_var_whitespace
  - literal_expression_end_indentation
  - lower_acl_than_parent
  # - missing_docs
  - modifier_order
  - multiline_arguments
  - multiline_arguments_brackets
  - multiline_function_chains
  - multiline_literal_brackets
  - multiline_parameters
  - multiline_parameters_brackets
  - nimble_operator
  - no_extension_access_modifier
  - no_grouping_extension
  - nslocalizedstring_key
  - nslocalizedstring_require_bundle
  - number_separator
  - operator_usage_whitespace
  - optional_enum_case_matching
  - overridden_super_call
  - override_in_extension
  - pattern_matching_keywords
  - prefer_self_in_static_references
  - prefer_self_type_over_type_of_self
  - prefer_zero_over_explicit_init
  - prefixed_toplevel_constant
  - private_action
  - private_outlet
  - prohibited_interface_builder
  - prohibited_super_call
  - quick_discouraged_call
  - quick_discouraged_focused_test
  - quick_discouraged_pending_test
  - redundant_nil_coalescing
  - redundant_type_annotation
  - required_enum_case
  - return_value_from_void_function
  - self_binding
  - shorthand_optional_binding
  - single_test_class
  - sorted_first_last
  - sorted_imports
  - strong_iboutlet
  - test_case_accessibility
  - toggle_bool
  - trailing_closure
  - unavailable_function
  - unneeded_parentheses_in_closure_argument
  - unowned_variable_capture
  - untyped_error_in_catch
  - vertical_parameter_alignment_on_call
  - vertical_whitespace_between_cases
  - vertical_whitespace_closing_braces
  - weak_delegate
  - xct_specific_matcher

custom_rules:

  # Empty line before and after MARK -------------------------------------------
  # mark_spacing:
  #   name: "Surround MARK by empty lines"
  #   regex: '\n[^\n]([^\n]*\/\/ MARK[^\n]*)\n[^\n]'
  #   message: "Surround MARK by empty lines"
  #   severity: warning

  # Empty line -----------------------------------------------------------------
  # no_empty_line_after_func:
  #   name: "No empty line after init or func"
  #   regex: '(func|init|let\s|var\s)[^\n]*\{[^\n\{\}]*\n\n'
  #   message: "No empty line after init or func"
  #   severity: warning

  # Empty line after canImport -----------------------------------------------------------------
  no_empty_line_after_can_import:
    name: "Add empty line after #if canImport"
    regex: '#if canImport\(.*\)\n[^\n]*(import|class|struct|enum|extension|protocol)'
    message: "Add empty line after #if canImport"
    severity: warning

  # Spacings -------------------------------------------------------------------
  empty_line_required:
    name: "Add empty line after class, struct, enum, extension or protocol"
    regex: '(class |struct |enum |extension |protocol )[^\n]*\{\n[^\n]*(class|struct|enum|extension|protocol|func|let|var|weak|private|internal|public|open|static|final|\/\/|init|case|@)'
    message: "Add empty line after class, struct, enum, extension or protocol"
    severity: warning
    match_kinds:
      - argument
      - attribute.builtin
      - attribute.id
      - buildconfig.id
      - buildconfig.keyword
      - comment
      - comment.mark
      - comment.url
      - identifier
      - keyword
      - number
      - objectliteral
      - parameter
      - placeholder
      - string
      - string_interpolation_anchor
      - typeidentifier

  
