<?xml version="1.0" encoding="utf-8"?>
<!-- @author gerrit addiks <gerrit.addiks@brille24.de> -->
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:orm="http://doctrine-project.org/schemas/orm/doctrine-mapping"
    xmlns:rdm="https://github.com/addiks/symfony_rdm/raw/master/Resources/mapping-schema.v1.xsd"
    targetNamespace="https://github.com/addiks/symfony_rdm/raw/master/Resources/mapping-schema.v1.xsd"
    elementFormDefault="qualified"
>

    <xs:import
        namespace="http://doctrine-project.org/schemas/orm/doctrine-mapping"
        schemaLocation="doctrine-mapping.xsd"
    />

    <xs:element name="import" type="rdm:import" />
    <xs:element name="service" type="rdm:service" />
    <xs:element name="choice" type="rdm:choice" />
    <xs:element name="object" type="rdm:object" />
    <xs:element name="array" type="rdm:array" />
    <xs:element name="list" type="rdm:list" />
    <xs:element name="null" type="rdm:null" />
    <xs:element name="nullable" type="rdm:nullable" />

    <xs:complexType name="null">
        <xs:attribute name="field"  type="xs:string" />
    </xs:complexType>

    <xs:complexType name="choice">
        <xs:sequence>
            <xs:element name="option" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:choice minOccurs="1" maxOccurs="1">
                        <xs:element name="import" type="rdm:import" />
                        <xs:element name="service" type="rdm:service" />
                        <xs:element name="choice" type="rdm:choice" />
                        <xs:element name="object" type="rdm:object" />
                        <xs:element name="array" type="rdm:array" />
                        <xs:element name="list" type="rdm:list" />
                        <xs:element name="field" type="orm:field" />
                        <xs:element name="null" type="rdm:null" />
                        <xs:element name="nullable" type="rdm:nullable" />
                    </xs:choice>
                    <xs:attribute name="name" type="xs:string" use="required" />
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="field"  type="xs:string" />
        <xs:attribute name="column" type="xs:string" use="required" />
    </xs:complexType>

    <xs:complexType name="object">
        <xs:sequence>
            <xs:element name="factory" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                        <xs:element name="import" type="rdm:import" />
                        <xs:element name="service" type="rdm:service" />
                        <xs:element name="choice" type="rdm:choice" />
                        <xs:element name="object" type="rdm:object" />
                        <xs:element name="array" type="rdm:array" />
                        <xs:element name="list" type="rdm:list" />
                        <xs:element name="field" type="orm:field" />
                        <xs:element name="null" type="rdm:null" />
                        <xs:element name="nullable" type="rdm:nullable" />
                    </xs:choice>
                    <xs:attribute name="object" type="xs:string" use="required" />
                    <xs:attribute name="method" type="xs:string" use="required" />
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="class" type="xs:string" use="required" />
        <xs:attribute name="field" type="xs:string" />
        <xs:attribute name="factory" type="xs:string" />
        <xs:attribute name="serialize" type="xs:string" />
        <xs:attribute name="nullable" type="xs:boolean" />
        <xs:attribute name="column" type="xs:string" />
        <xs:attribute name="column-type" type="xs:string" />
        <xs:attribute name="column-length" type="xs:integer" />
        <xs:attribute name="column-default" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="list">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="import" type="rdm:import" />
            <xs:element name="service" type="rdm:service" />
            <xs:element name="choice" type="rdm:choice" />
            <xs:element name="object" type="rdm:object" />
            <xs:element name="array" type="rdm:array" />
            <xs:element name="null" type="rdm:null" />
            <xs:element name="nullable" type="rdm:nullable" />
        </xs:choice>
        <xs:attribute name="field" type="xs:string" />
        <xs:attribute name="column" type="xs:string" />
        <xs:attribute name="column-length" type="xs:integer" />
    </xs:complexType>

    <xs:complexType name="array">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="import" type="rdm:import" />
            <xs:element name="entry" type="rdm:entry" />
            <xs:element name="service" type="rdm:service" />
            <xs:element name="choice" type="rdm:choice" />
            <xs:element name="object" type="rdm:object" />
            <xs:element name="array" type="rdm:array" />
            <xs:element name="field" type="orm:field" />
            <xs:element name="null" type="rdm:null" />
            <xs:element name="nullable" type="rdm:nullable" />
        </xs:choice>
        <xs:attribute name="field" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="entry">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="import" type="rdm:import" />
            <xs:element name="service" type="rdm:service" />
            <xs:element name="choice" type="rdm:choice" />
            <xs:element name="object" type="rdm:object" />
            <xs:element name="array" type="rdm:array" />
            <xs:element name="list" type="rdm:list" />
            <xs:element name="field" type="orm:field" />
            <xs:element name="null" type="rdm:null" />
            <xs:element name="nullable" type="rdm:nullable" />
        </xs:choice>
        <xs:attribute name="key" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="service">
        <xs:attribute name="field" type="xs:string" />
        <xs:attribute name="id"    type="xs:string" use="required" />
        <xs:attribute name="lax"   type="xs:string" />
    </xs:complexType>

    <xs:complexType name="nullable">
        <xs:attribute name="field" type="xs:string" />
        <xs:attribute name="column" type="xs:string" />
        <xs:attribute name="strict" type="xs:boolean" />
        <xs:choice minOccurs="1" maxOccurs="1">
            <xs:element name="import" type="rdm:import" />
            <xs:element name="service" type="rdm:service" />
            <xs:element name="choice" type="rdm:choice" />
            <xs:element name="object" type="rdm:object" />
            <xs:element name="array" type="rdm:array" />
            <xs:element name="list" type="rdm:list" />
            <xs:element name="field" type="orm:field" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="import">
        <xs:attribute name="field" type="xs:string" />
        <xs:attribute name="column-prefix" type="xs:string" />
        <xs:attribute name="path"  type="xs:string" use="required" />
    </xs:complexType>

</xs:schema>
