///|
/// Disable one rule code in a copy of a lint configuration.
pub fn LintConfig::disable(self : LintConfig, code : String) -> LintConfig {
  if self.disabled.contains(code) {
    self
  } else {
    let disabled = self.disabled.copy()
    disabled.push(code)
    { ..self, disabled, }
  }
}

///|
/// Re-enable one rule code in a copy of a lint configuration.
pub fn LintConfig::enable(self : LintConfig, code : String) -> LintConfig {
  let disabled : Array[String] = []
  for value in self.disabled {
    if value != code {
      disabled.push(value)
    }
  }
  { ..self, disabled, }
}

///|
/// Turn warnings-as-errors on or off in a copy of a lint configuration.
pub fn LintConfig::warnings_as_errors(
  self : LintConfig,
  enabled : Bool,
) -> LintConfig {
  { ..self, warnings_as_errors: enabled }
}

///|
/// Return whether a rule code will run under this configuration.
pub fn LintConfig::is_enabled(self : LintConfig, code : String) -> Bool {
  self.enabled(code)
}

///|
/// Return the active rules in their stable declaration order.
pub fn LintConfig::active_rules(self : LintConfig) -> Array[Rule] {
  let rules : Array[Rule] = []
  for rule in default_rules() {
    if self.enabled(rule.code()) {
      rules.push(rule)
    }
  }
  rules
}

///|
/// Return all known rule codes, including disabled rules.
pub fn rule_codes() -> Array[String] {
  let codes : Array[String] = []
  for rule in default_rules() {
    codes.push(rule.code())
  }
  codes
}

///|
/// Return disabled codes which are not recognized by this release.
pub fn LintConfig::unknown_disabled_rules(self : LintConfig) -> Array[String] {
  let unknown : Array[String] = []
  for code in self.disabled {
    if !rule_codes().contains(code) && !unknown.contains(code) {
      unknown.push(code)
    }
  }
  unknown
}

///|
/// Return a short stable configuration description for logs.
pub fn LintConfig::describe(self : LintConfig) -> String {
  "active_rules=" +
  self.active_rules().length().to_string() +
  ", warnings_as_errors=" +
  self.warnings_as_errors.to_string() +
  ", disabled=" +
  self.disabled.length().to_string()
}