{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "Doctrine ORM Entity JSON schema for Xcore Generator",
    "type": "object",
    "definitions": {
        "entity-name": {
            "type": "string",
            "description": "Entity name without namespace",
            "minLength": 1
        },
        "property-name": {
            "type": "string",
            "description": "Property name",
            "minLength": 1
        }
    },
    "properties": {
        "name": {
            "$ref": "#/definitions/entity-name"
        },
        "get": {
            "type": "boolean"
        },
        "set": {
            "type": "boolean"
        },
        "namespace": {
            "type": "string"
        },
        "nullable": {
            "type": "boolean",
            "default": true,
            "description": "All properties are nullable by default."
        },
        "properties": {
            "type": "array",
            "minItems": 1,
            "items": {
                "properties": {
                    "id": {
                        "type": "boolean",
                        "default": true
                    },
                    "generatedValue": {
                        "enum": [
                            "AUTO",
                            "SEQUENCE",
                            "IDENTITY",
                            "UUID",
                            "TABLE",
                            "NONE",
                            "CUSTOM"
                        ],
                        "default": "AUTO"
                    },
                    "sequenceGenerator": {
                        "type": "object",
                        "properties": {
                            "sequenceName": {
                                "type": "string"
                            },
                            "initialValue": {
                                "type": "integer"
                            },
                            "allocationSize": {
                                "type": "integer"
                            }
                        }
                    },
                    "name": {
                        "$ref": "#/definitions/property-name"
                    },
                    "columnName": {
                        "type": "string"
                    },
                    "get": {
                        "enum": [
                            true,
                            false,
                            "has",
                            "is"
                        ],
                        "description": "Whether is getter enabled/getter type"
                    },
                    "set": {
                        "type": "boolean"
                    },
                    "length": {
                        "type": "integer",
                        "minimum": 1
                    },
                    "nullable": {
                        "type": "boolean",
                        "default": true
                    },
                    "type": {
                        "enum": [
                            "string",
                            "integer",
                            "smallint",
                            "bigint",
                            "boolean",
                            "decimal",
                            "date",
                            "time",
                            "datetime",
                            "datetimez",
                            "text",
                            "object",
                            "array",
                            "simple_array",
                            "json_array",
                            "float",
                            "guid",
                            "blob"
                        ]
                    },
                    "manyToOne": {
                        "type": "object",
                        "properties": {
                            "targetEntity": {
                                "type": "string"
                            },
                            "inversedBy": {
                                "type": "string"
                            }
                        },
                        "required": [
                            "targetEntity"
                        ]
                    },
                    "oneToOne": {
                        "type": "object",
                        "properties": {
                            "targetEntity": {
                                "type": "string"
                            },
                            "mappedBy": {
                                "type": "string"
                            },
                            "inversedBy": {
                                "type": "string"
                            }
                        },
                        "required": [
                            "targetEntity"
                        ]
                    },
                    "oneToMany": {
                        "type": "object",
                        "properties": {
                            "targetEntity": {
                                "type": "string"
                            },
                            "mappedBy": {
                                "type": "string"
                            }
                        }
                    },
                    "manyToMany": {
                        "type": "object",
                        "properties": {
                            "targetEntity": {
                                "type": "string"
                            },
                            "inversedBy": {
                                "type": "string"
                            },
                            "mappedBy": {
                                "type": "string"
                            }
                        }
                    },
                    "joinColumn": {
                        "type": "object",
                        "properties": {
                            "name": {
                                "type": "string"
                            },
                            "referencedColumnName": {
                                "type": "string"
                            }
                        }
                    },
                    "asserts": {
                        "type": "array",
                        "_uniqueItems": true,
                        "minItems": 1,
                        "items": {
                            "oneOf": [
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "NotBlank"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Blank"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "NotNull"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "IsNull"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "IsTrue"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "IsFalse"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Type"
                                            ]
                                        },
                                        "type": {
                                            "enum": [
                                                "array",
                                                "bool",
                                                "callable",
                                                "float",
                                                "double",
                                                "int",
                                                "integer",
                                                "long",
                                                "null",
                                                "numeric",
                                                "object",
                                                "real",
                                                "resource",
                                                "scalar",
                                                "string",
                                                "alnum",
                                                "alpha",
                                                "cntrl",
                                                "digit",
                                                "graph",
                                                "lower",
                                                "print",
                                                "punct",
                                                "space",
                                                "upper",
                                                "xdigit"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    },
                                    "required": [
                                        "type"
                                    ]
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Email"
                                            ]
                                        },
                                        "strict": {
                                            "type": "boolean",
                                            "default": true
                                        },
                                        "checkMX": {
                                            "type": "boolean",
                                            "default": true
                                        },
                                        "checkHost": {
                                            "type": "boolean",
                                            "default": true
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Length"
                                            ]
                                        },
                                        "min": {
                                            "type": "integer"
                                        },
                                        "max": {
                                            "type": "integer"
                                        },
                                        "charset": {
                                            "type": "integer",
                                            "default": "UTF-8"
                                        },
                                        "minMessage": {
                                            "type": "string"
                                        },
                                        "maxMessage": {
                                            "type": "string"
                                        },
                                        "exactMessage": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Url"
                                            ]
                                        },
                                        "protocols": {
                                            "type": "array",
                                            "items": {
                                                "type": "string"
                                            }
                                        },
                                        "checkDNS": {
                                            "type": "boolean",
                                            "default": true
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Regex"
                                            ]
                                        },
                                        "pattern": {
                                            "type": "string"
                                        },
                                        "htmlPattern": {
                                            "type": [
                                                "string",
                                                "boolean"
                                            ]
                                        },
                                        "match": {
                                            "type": "boolean",
                                            "default": true
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Ip"
                                            ]
                                        },
                                        "version": {
                                            "enum": [
                                                "4",
                                                "6",
                                                "all",
                                                "4_no_priv",
                                                "6_no_priv",
                                                "all_no_priv",
                                                "4_no_res",
                                                "6_no_res",
                                                "all_no_res",
                                                "4_public",
                                                "6_public",
                                                "all_public"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Uuid"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Range"
                                            ]
                                        },
                                        "min": {
                                            "type": [
                                                "integer",
                                                "string"
                                            ]
                                        },
                                        "max": {
                                            "type": [
                                                "integer",
                                                "string"
                                            ]
                                        },
                                        "minMessage": {
                                            "type": "string"
                                        },
                                        "maxMessage": {
                                            "type": "string"
                                        },
                                        "invalidMessage": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "EqualTo"
                                            ]
                                        },
                                        "value": {
                                            "type": [
                                                "integer",
                                                "number",
                                                "null",
                                                "string",
                                                "boolean"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "NotEqualTo"
                                            ]
                                        },
                                        "value": {
                                            "type": [
                                                "integer",
                                                "number",
                                                "null",
                                                "string",
                                                "boolean"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "IdenticalTo"
                                            ]
                                        },
                                        "value": {
                                            "type": [
                                                "integer",
                                                "number",
                                                "null",
                                                "string",
                                                "boolean"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "NotIdenticalTo"
                                            ]
                                        },
                                        "value": {
                                            "type": [
                                                "integer",
                                                "number",
                                                "null",
                                                "string",
                                                "boolean"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "LessThan"
                                            ]
                                        },
                                        "value": {
                                            "type": [
                                                "integer",
                                                "number",
                                                "null",
                                                "string",
                                                "boolean"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "LessThanOrEqual"
                                            ]
                                        },
                                        "value": {
                                            "type": [
                                                "integer",
                                                "number",
                                                "null",
                                                "string",
                                                "boolean"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "GreaterThan"
                                            ]
                                        },
                                        "value": {
                                            "type": [
                                                "integer",
                                                "number",
                                                "null",
                                                "string",
                                                "boolean"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "GreaterThanOrEqual"
                                            ]
                                        },
                                        "value": {
                                            "type": [
                                                "integer",
                                                "number",
                                                "null",
                                                "string",
                                                "boolean"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Date"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "DateTime"
                                            ]
                                        },
                                        "format": {
                                            "type": "string"
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Time"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Language"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Locale"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Country"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Currency"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Luhn"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Iban"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                },
                                {
                                    "properties": {
                                        "assert": {
                                            "enum": [
                                                "Bic"
                                            ]
                                        },
                                        "message": {
                                            "type": "string"
                                        }
                                    }
                                }
                            ],
                            "required": [
                                "assert"
                            ]
                        }
                    }
                },
                "additionalProperties": false,
                "required": [
                    "name"
                ]
            },
            "additionalProperties": false
        }
    },
    "required": [
        "name"
    ],
    "additionalProperties": false
}