///|
pub(all) struct ContractStats {
  field_count : Int
  required_field_count : Int
  typed_field_count : Int
  rule_count : Int
  error_rule_count : Int
  warning_rule_count : Int
} derive(Eq, Debug)

///|
/// Return stable complexity indicators for documentation and review tooling.
pub fn contract_stats(contract : Contract) -> ContractStats {
  let mut required_field_count = 0
  let mut typed_field_count = 0
  for field in contract.fields {
    if field.required {
      required_field_count += 1
    }
    if field.kind != String {
      typed_field_count += 1
    }
  }
  let mut error_rule_count = 0
  let mut warning_rule_count = 0
  for rule in contract.rules {
    match severity_of(rule) {
      Error => error_rule_count += 1
      Warning => warning_rule_count += 1
    }
  }
  {
    field_count: contract.fields.length(),
    required_field_count,
    typed_field_count,
    rule_count: contract.rules.length(),
    error_rule_count,
    warning_rule_count,
  }
}