{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://www.namelint.dev/namelint-rule-schema.json",
  "title": "Namelint rule definition file schema",
  "description": "Schema for the definition of filename rules and rule sets",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "rules": {
      "type": "array",
      "description": "Rule definitions",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "rule_id": {
            "type": "string",
            "description": "Code-friendly id for the rule"
          },
          "title": {
            "type": "string",
            "description": "Human friendly short name for the rule"
          },
          "description": {
            "type": "string",
            "description": "Longer description of the rule, in markdown"
          },
          "examples": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "expect": {
                  "enum": [
                    "fail",
                    "pass"
                  ]
                },
                "notes": {
                  "type": "string"
                },
                "value": {
                  "type": "string"
                }
              },
              "anyOf": [
                {
                  "required": [
                    "expect",
                    "value"
                  ]
                },
                {
                  "required": [
                    "expect",
                    "valueBytes"
                  ]
                }
              ]
            }
          },
          "regex": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "pattern": {
                "type": "string"
              },
              "case_insensitive": {
                "type": "boolean"
              },
              "expect": {
                "enum": [
                  "match",
                  "nonmatch"
                ],
                "description": "Expected regex result to pass the rule"
              }
            },
            "required": [
              "pattern",
              "expect"
            ]
          }
        },
        "required": [
          "rule_id"
        ]
      }
    },
    "rulesets": {
      "type": "array",
      "description": "Rule set definitions",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "ruleset_id": {
            "type": "string",
            "description": "Code-friendly id for the rule set"
          },
          "title": {
            "type": "string",
            "description": "Human-friendly short name for the rule set"
          },
          "description": {
            "type": "string",
            "description": "Longer description of the rule set, in markdown"
          },
          "rules": {
            "type": "array",
            "description": "List of rule_id of rules to include in this rule set",
            "items": {
              "type": "string"
            }
          },
          "rulesets": {
            "type": "array",
            "description": "List of ruleset_id of rule sets to include in this rule set",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "ruleset_id"
        ]
      }
    }
  },
  "anyOf": [
    {
      "required": [
        "rules"
      ]
    },
    {
      "required": [
        "rulesets"
      ]
    }
  ]
}
