{
    "$schema": "http://json-schema.org/draft-06/schema#",
    "title": "AST Schema V1",
    "description": "Structure of an AST object",
    "type": "object",
    "properties": {
        "id": {
            "desceription": "A unique identifier for the current element",
            "type": "integer"
        },
        "type": {
            "description": "The type category of the element (component/var/derived)",
            "type": "string",
            "enum": [
                "component",
                "var",
                "derived",
                "textnode",
                "data",
                "meta"
            ]
        },
        "name": {
            "description": "The name of the element",
            "type": "string"
        },
        "properties": {
            "description": "The properties/attributes of the element",
            "type": "object",
            "patternProperties": {
                "^w+": {
                    "description": "Object containing data for the particular property",
                    "type": "object",
                    "properties": {
                        "type": {
                            "description": "The evaluation type of the property. Can be value/variable/expression",
                            "type": "string",
                            "enum": [
                                "value",
                                "variable",
                                "expression"
                            ]
                        },
                        "value": {
                            "description": "Property value",
                            "type": [
                                "string",
                                "number",
                                "boolean"
                            ]
                        }
                    },
                    "additionalProperties": false
                }
            }
        },
        "children": {
            "description": "The children of the element.",
            "type": "array",
            "items": {
                "anyof": [
                    {
                        "$ref": "#"
                    },
                    {
                        "description": "Structure for a textnode",
                        "type": "object",
                        "properties": {
                            "id": {
                                "desceription": "A unique identifier for the current element",
                                "id": "integer"
                            },
                            "type": {
                                "description": "The type category of the element",
                                "type": "string",
                                "enum": [
                                    "textnode"
                                ]
                            },
                            "value": {
                                "description": "Text value in the textnode",
                                "type": "string"
                            }
                        },
                        "required": [
                            "id",
                            "type",
                            "value"
                        ],
                        "additionalProperties": false
                    },
                    {
                        "description": "Structure for var and derived",
                        "type": "object",
                        "properties": {
                            "id": {
                                "desceription": "A unique identifier for the current element",
                                "id": "integer"
                            },
                            "type": {
                                "description": "The type category of the element",
                                "type": "string",
                                "enum": [
                                    "var",
                                    "derived"
                                ]
                            },
                            "properties": {
                                "name": {
                                    "description": "Name of the variable",
                                    "type": "object",
                                    "properties": {
                                        "type": {
                                            "type": "string",
                                            "enum": [
                                                "value",
                                                "variable",
                                                "expression"
                                            ]
                                        },
                                        "value": {
                                            "type": "string"
                                        }
                                    },
                                    "required": [
                                        "name",
                                        "value"
                                    ],
                                    "additionalProperties": false
                                },
                                "value": {
                                    "description": "Source for the data",
                                    "type": "object",
                                    "properties": {
                                        "properties": {
                                            "type": {
                                                "type": "string",
                                                "enum": [
                                                    "value",
                                                    "variable",
                                                    "expression"
                                                ]
                                            },
                                            "value": {
                                                "type": "string"
                                            }
                                        }
                                    },
                                    "required": [
                                        "name",
                                        "value"
                                    ],
                                    "additionalProperties": false
                                }
                            },
                            "additionalProperties": false,
                            "required": [
                                "id",
                                "type",
                                "properties"
                            ]
                        }
                    },
                    {
                        "description": "Structure for data",
                        "type": "object",
                        "properties": {
                            "id": {
                                "desceription": "A unique identifier for the current element",
                                "id": "integer"
                            },
                            "type": {
                                "description": "The type category of the element",
                                "type": "string",
                                "enum": [
                                    "data"
                                ]
                            },
                            "properties": {
                                "name": {
                                    "description": "Name of the variable",
                                    "type": "object",
                                    "properties": {
                                        "type": {
                                            "type": "string",
                                            "enum": [
                                                "value",
                                                "variable",
                                                "expression"
                                            ]
                                        },
                                        "value": {
                                            "type": "string"
                                        }
                                    },
                                    "required": [
                                        "type",
                                        "value"
                                    ],
                                    "additionalProperties": false
                                },
                                "source": {
                                    "description": "Source for the data",
                                    "type": "object",
                                    "properties": {
                                        "properties": {
                                            "type": {
                                                "type": "string",
                                                "enum": [
                                                    "value",
                                                    "variable",
                                                    "expression"
                                                ]
                                            },
                                            "value": {
                                                "type": "string"
                                            }
                                        }
                                    },
                                    "required": [
                                        "type",
                                        "value"
                                    ],
                                    "additionalProperties": false
                                }
                            },
                            "required": [
                                "id",
                                "type",
                                "properties"
                            ]
                        }
                    }
                ]
            },
            "_uniqueItems": true
        }
    },
    "required": [
        "id",
        "type"
    ]
}