{
  "$id": "http://asl-validator.cloud/jsonata.json#",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "output": {
      "oneOf": [
        {
          "$ref": "#/definitions/jsonata"
        },
        {
          "$ref": "#/definitions/_jsonata_template_object"
        }
      ]
    },
    "assign": {
      "$ref": "#/definitions/_jsonata_template_object"
    },
    "arguments": {
      "oneOf": [
        {
          "$ref": "#/definitions/jsonata"
        },
        {
          "$ref": "#/definitions/_jsonata_template_object"
        }
      ]
    },
    "queryLanguage": {
      "type": "string",
      "enum": ["JSONata"]
    },
    "condition": {
      "$ref": "#/definitions/jsonata"
    },
    "jsonata": {
      "$comment": "A string that is a JSONata expression",
      "type": "string",
      "pattern": "^\\{% .+ %\\}$",
      "format": "jsonata_string"
    },
    "not_jsonata": {
      "$comment": "A string that is not a JSONata expression",
      "type": "string",
      "pattern": "^(?!\\{% )(.+)(?! %\\})$"
    },
    "maybe_jsonata": {
      "oneOf": [
        {
          "$ref": "#/definitions/not_jsonata"
        },
        {
          "$ref": "#/definitions/jsonata"
        }
      ]
    },
    "_jsonata_template_object": {
      "type": "object",
      "patternProperties": {
        "^.+$": {
          "$comment": "Require string fields to be maybe_jsonata",
          "oneOf": [
            {
              "type": ["number", "boolean", "null"]
            },
            {
              "$ref": "#/definitions/maybe_jsonata"
            },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/jsonata_template"
              }
            },
            {
              "$ref": "#/definitions/_jsonata_template_object"
            }
          ]
        }
      }
    },
    "jsonata_template": {
      "oneOf": [
        {
          "$ref": "#/definitions/_jsonata_template_object"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/definitions/_jsonata_template_object"
          }
        },
        {
          "type": ["boolean", "number", "null"]
        },
        {
          "$ref": "#/definitions/maybe_jsonata"
        }
      ]
    }
  }
}
