{
  "oneOf": [
    { "$ref": "#/definitions/element" }
  ],
  "definitions": {
    "element": {
      "title": "Element",
      "type": "object",
      "properties": {
        "element": {
          "type": "string"
        },
        "meta": {
          "type": "object",
          "properties": {
            "id": { "$ref": "#/definitions/element" },
            "title": { "$ref": "#/definitions/string-element" },
            "description": { "$ref": "#/definitions/string-element" },
            "ref": { "$ref": "#/definitions/ref-element" },
            "classes": { "$ref": "#/definitions/array-string-element" },
            "links": { "$ref": "#/definitions/array-link-element" }
          },
          "additionalProperties": false
        },
        "attributes": {
          "type": "object",
          "patternProperties": {
            "": {
              "$ref": "#/definitions/element"
            }
          }
        },
        "content": {
          "oneOf": [
            {
              "type": [
                "string",
                "number",
                "boolean",
                "null",
                "array"
              ],
              "items": {
                "$ref": "#/definitions/element"
              }
            },
            {
              "$ref": "#/definitions/element"
            },
            {
              "$ref": "#/definitions/key-value-pair"
            }
          ]
        }
      },
      "required": [
        "element"
      ],
      "additionalProperties": false
    },
    "key-value-pair": {
      "title": "Key Value Pair",
      "type": "object",
      "properties": {
        "key": {
          "$ref": "#/definitions/element"
        },
        "value": {
          "$ref": "#/definitions/element"
        }
      },
      "required": ["key"],
      "additionalProperties": false
    },
    "string-element": {
      "title": "String Element",
      "allOf": [
        { "$ref": "#/definitions/element" },
        {
          "properties": {
            "element": {
              "enum": ["string"]
            },
            "content": {
              "type": ["string"]
            }
          }
        }
      ]
    },
    "array-element": {
      "title": "Array Element",
      "allOf": [
        { "$ref": "#/definitions/element" },
        {
          "properties": {
            "element": {
              "enum": ["array"]
            },
            "content": {
              "type": ["array"]
            }
          }
        }
      ]
    },
    "array-string-element": {
      "title": "Array Element of String Element",
      "allOf": [
        { "$ref": "#/definitions/array-element" },
        {
          "properties": {
            "content": {
              "items": { "$ref": "#/definitions/string-element" }
            }
          }
        }
      ]
    },
    "link-element": {
      "title": "Link Element",
      "allOf": [
        { "$ref": "#/definitions/element" },
        {
          "properties": {
            "element": {
              "enum": ["link"]
            }
          }
        }
      ]
    },
    "array-link-element": {
      "title": "Array Element of Link Element",
      "allOf": [
        { "$ref": "#/definitions/array-element" },
        {
          "properties": {
            "content": {
              "items": { "$ref": "#/definitions/link-element" }
            }
          }
        }
      ]
    },
    "ref-element": {
      "title": "Reference Element",
      "allOf": [
        { "$ref": "#/definitions/element" },
        {
          "properties": {
            "element": {
              "enum": ["ref"]
            },
            "content": {
              "type": ["string"]
            },
            "attributes": {
              "properties": {
                "path": {
                  "allOf": [
                    { "$ref": "#/definitions/string-element" },
                    {
                      "properties": {
                        "content": {
                          "enum": ["element", "meta", "attributes", "content"]
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "required": ["content"]
        }
      ]
    }
  }
}
