<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="urn:rocket:partner-api:v1"
  xmlns:rocket="urn:rocket:partner-api:v1"
  elementFormDefault="qualified" attributeFormDefault="unqualified">

  <!-- Rocket's typed XML mapping of the existing Partner API v1 JSON value model. -->
  <xs:element name="request" type="rocket:envelopeType"/>
  <xs:element name="response" type="rocket:envelopeType"/>

  <xs:complexType name="envelopeType">
    <xs:sequence>
      <xs:element ref="rocket:object"/>
    </xs:sequence>
    <xs:attribute name="version" use="required" fixed="1"/>
  </xs:complexType>

  <xs:element name="object" type="rocket:objectType"/>
  <xs:complexType name="objectType">
    <xs:sequence>
      <xs:element ref="rocket:property" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="property" type="rocket:propertyType"/>
  <xs:complexType name="propertyType">
    <xs:choice>
      <xs:element ref="rocket:object"/>
      <xs:element ref="rocket:array"/>
      <xs:element ref="rocket:string"/>
      <xs:element ref="rocket:number"/>
      <xs:element ref="rocket:boolean"/>
      <xs:element ref="rocket:null"/>
    </xs:choice>
    <xs:attribute name="name" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:element name="array" type="rocket:arrayType"/>
  <xs:complexType name="arrayType">
    <xs:sequence>
      <xs:element ref="rocket:item" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="item" type="rocket:valueType"/>
  <xs:complexType name="valueType">
    <xs:choice>
      <xs:element ref="rocket:object"/>
      <xs:element ref="rocket:array"/>
      <xs:element ref="rocket:string"/>
      <xs:element ref="rocket:number"/>
      <xs:element ref="rocket:boolean"/>
      <xs:element ref="rocket:null"/>
    </xs:choice>
  </xs:complexType>

  <xs:element name="string" type="xs:string"/>
  <xs:element name="number" type="rocket:jsonNumberType"/>
  <xs:simpleType name="jsonNumberType">
    <xs:restriction base="xs:string">
      <xs:pattern value="-?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="boolean" type="rocket:jsonBooleanType"/>
  <xs:simpleType name="jsonBooleanType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="true"/>
      <xs:enumeration value="false"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="null" type="rocket:jsonNullType"/>
  <xs:simpleType name="jsonNullType">
    <xs:restriction base="xs:string">
      <xs:pattern value="\s*"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>
