1{
2    "$schema": "http://json-schema.org/draft-04/schema#",
3    "type": "object",
4    "required": [
5        "version",
6        "name",
7        "const_declarations",
8        "enum_declarations",
9        "interface_declarations",
10        "struct_declarations",
11        "table_declarations",
12        "union_declarations",
13        "declaration_order",
14        "declarations",
15        "library_dependencies"
16    ],
17    "properties": {
18        "version": {
19            "$ref": "#/definitions/version"
20        },
21        "name": {
22            "$ref": "#/definitions/library-identifier"
23        },
24        "const_declarations": {
25            "type": "array",
26            "items": {
27                "$ref": "#/definitions/const"
28            }
29        },
30        "enum_declarations": {
31            "type": "array",
32            "items": {
33                "$ref": "#/definitions/enum"
34            }
35        },
36        "interface_declarations": {
37            "type": "array",
38            "items": {
39                "$ref": "#/definitions/interface"
40            }
41        },
42        "struct_declarations": {
43            "type": "array",
44            "items": {
45                "$ref": "#/definitions/struct"
46            }
47        },
48        "table_declarations": {
49            "type": "array",
50            "items": {
51                "$ref": "#/definitions/table"
52            }
53        },
54        "union_declarations": {
55            "type": "array",
56            "items": {
57                "$ref": "#/definitions/union"
58            }
59        },
60        "declaration_order": {
61            "type": "array",
62            "items": {
63                "$ref": "#/definitions/compound-identifier"
64            }
65        },
66        "declarations": {
67            "$ref": "#/definitions/declarations-map"
68        },
69        "library_dependencies": {
70            "type": "array",
71            "items": {
72                "$ref": "#/definitions/library"
73            }
74        }
75    },
76    "definitions": {
77        "const": {
78            "type": "object",
79            "required": [
80                "name",
81                "type",
82                "value"
83            ],
84            "properties": {
85                "maybe_attributes": {
86                    "$ref": "#/definitions/attributes-list"
87                },
88                "name": {
89                    "$ref": "#/definitions/compound-identifier"
90                },
91                "type": {
92                    "$ref": "#/definitions/type"
93                },
94                "value": {
95                    "$ref": "#/definitions/constant"
96                }
97            }
98        },
99        "enum": {
100            "type": "object",
101            "required": [
102                "name",
103                "type",
104                "members"
105            ],
106            "properties": {
107                "maybe_attributes": {
108                    "$ref": "#/definitions/attributes-list"
109                },
110                "name": {
111                    "$ref": "#/definitions/compound-identifier"
112                },
113                "type": {
114                    "$ref": "#/definitions/integer-type"
115                },
116                "members": {
117                    "type": "array",
118                    "items": {
119                        "$ref": "#/definitions/enum-member"
120                    }
121                }
122            }
123        },
124        "enum-member": {
125            "type": "object",
126            "required": [
127                "name",
128                "value"
129            ],
130            "properties": {
131                "name": {
132                    "$ref": "#/definitions/identifier"
133                },
134                "maybe_attributes": {
135                    "$ref": "#/definitions/attributes-list"
136                },
137                "value": {
138                    "$ref": "#/definitions/constant"
139                }
140            }
141        },
142        "interface": {
143            "type": "object",
144            "required": [
145                "name",
146                "methods"
147            ],
148            "properties": {
149                "maybe_attributes": {
150                    "$ref": "#/definitions/attributes-list"
151                },
152                "name": {
153                    "$ref": "#/definitions/compound-identifier"
154                },
155                "methods": {
156                    "type": "array",
157                    "items": {
158                        "$ref": "#/definitions/interface-method"
159                    }
160                }
161            }
162        },
163        "interface-method": {
164            "type": "object",
165            "required": [
166                "ordinal",
167                "name",
168                "has_request",
169                "has_response"
170            ],
171            "properties": {
172                "maybe_attributes": {
173                    "$ref": "#/definitions/attributes-list"
174                },
175                "ordinal": {
176                    "$ref": "#/definitions/ordinal"
177                },
178                "name": {
179                    "$ref": "#/definitions/identifier"
180                },
181                "has_request": {
182                    "type": "boolean"
183                },
184                "maybe_request": {
185                    "type": "array",
186                    "items": {
187                        "$ref": "#/definitions/interface-method-parameter"
188                    }
189                },
190                "maybe_request_size": {
191                    "$ref": "#/definitions/size"
192                },
193                "maybe_request_alignment": {
194                    "$ref": "#/definitions/size"
195                },
196                "has_response": {
197                    "type": "boolean"
198                },
199                "maybe_response": {
200                    "type": "array",
201                    "items": {
202                        "$ref": "#/definitions/interface-method-parameter"
203                    }
204                },
205                "maybe_response_size": {
206                    "$ref": "#/definitions/size"
207                },
208                "maybe_response_alignment": {
209                    "$ref": "#/definitions/size"
210                }
211            }
212        },
213        "interface-method-parameter": {
214            "type": "object",
215            "required": [
216                "type",
217                "name",
218                "size",
219                "alignment",
220                "offset"
221            ],
222            "properties": {
223                "type": {
224                    "$ref": "#/definitions/type"
225                },
226                "name": {
227                    "$ref": "#/definitions/identifier"
228                },
229                "size": {
230                    "$ref": "#/definitions/size"
231                },
232                "alignment": {
233                    "$ref": "#/definitions/size"
234                },
235                "offset": {
236                    "$ref": "#/definitions/size"
237                }
238            }
239        },
240        "struct": {
241            "type": "object",
242            "required": [
243                "name",
244                "members",
245                "size"
246            ],
247            "properties": {
248                "max_handles": {
249                    "$ref": "#/definitions/max-handles"
250                },
251                "maybe_attributes": {
252                    "$ref": "#/definitions/attributes-list"
253                },
254                "name": {
255                    "$ref": "#/definitions/compound-identifier"
256                },
257                "members": {
258                    "type": "array",
259                    "items": {
260                        "$ref": "#/definitions/struct-member"
261                    }
262                },
263                "size": {
264                    "$ref": "#/definitions/size"
265                }
266            }
267        },
268        "struct-member": {
269            "type": "object",
270            "required": [
271                "type",
272                "name",
273                "size",
274                "alignment",
275                "offset"
276            ],
277            "properties": {
278                "type": {
279                    "$ref": "#/definitions/type"
280                },
281                "name": {
282                    "$ref": "#/definitions/identifier"
283                },
284                "size": {
285                    "$ref": "#/definitions/size"
286                },
287                "alignment": {
288                    "$ref": "#/definitions/size"
289                },
290                "offset": {
291                    "$ref": "#/definitions/size"
292                },
293                "maybe_attributes": {
294                    "$ref": "#/definitions/attributes-list"
295                },
296                "maybe_default_value": {
297                    "$ref": "#/definitions/constant"
298                }
299            }
300        },
301        "table": {
302            "type": "object",
303            "required": [
304                "name",
305                "members",
306                "size"
307            ],
308            "properties": {
309                "max_handles": {
310                    "$ref": "#/definitions/max-handles"
311                },
312                "maybe_attributes": {
313                    "$ref": "#/definitions/attributes-list"
314                },
315                "name": {
316                    "$ref": "#/definitions/compound-identifier"
317                },
318                "members": {
319                    "type": "array",
320                    "items": {
321                        "$ref": "#/definitions/table-member"
322                    }
323                },
324                "size": {
325                    "$ref": "#/definitions/size"
326                }
327            }
328        },
329        "table-member": {
330            "type": "object",
331            "required": [
332                "ordinal",
333                "reserved"
334            ],
335            "properties": {
336                "reserved": {
337                    "type": "boolean"
338                },
339                "type": {
340                    "$ref": "#/definitions/type"
341                },
342                "name": {
343                    "$ref": "#/definitions/identifier"
344                },
345                "ordinal": {
346                    "$ref": "#/definitions/ordinal"
347                },
348                "size": {
349                    "$ref": "#/definitions/size"
350                },
351                "alignment": {
352                    "$ref": "#/definitions/size"
353                },
354                "offset": {
355                    "$ref": "#/definitions/size"
356                },
357                "maybe_default_value": {
358                    "$ref": "#/definitions/constant"
359                }
360            }
361        },
362        "union": {
363            "type": "object",
364            "required": [
365                "name",
366                "members",
367                "size",
368                "alignment"
369            ],
370            "properties": {
371                "max_handles": {
372                    "$ref": "#/definitions/max-handles"
373                },
374                "maybe_attributes": {
375                    "$ref": "#/definitions/attributes-list"
376                },
377                "name": {
378                    "$ref": "#/definitions/compound-identifier"
379                },
380                "members": {
381                    "type": "array",
382                    "items": {
383                        "$ref": "#/definitions/union-member"
384                    }
385                },
386                "size": {
387                    "$ref": "#/definitions/size"
388                },
389                "alignment": {
390                    "$ref": "#/definitions/size"
391                }
392            }
393        },
394        "union-member": {
395            "type": "object",
396            "required": [
397                "type",
398                "name",
399                "size",
400                "alignment",
401                "offset"
402            ],
403            "properties": {
404                "type": {
405                    "$ref": "#/definitions/type"
406                },
407                "name": {
408                    "$ref": "#/definitions/identifier"
409                },
410                "size": {
411                    "$ref": "#/definitions/size"
412                },
413                "alignment": {
414                    "$ref": "#/definitions/size"
415                },
416                "offset": {
417                    "$ref": "#/definitions/size"
418                },
419                "maybe_attributes": {
420                    "$ref": "#/definitions/attributes-list"
421                }
422            }
423        },
424        "declarations-map": {
425            "type": "object",
426            "patternProperties": {
427                ".*": {
428                    "type": "string",
429                    "enum": [
430                        "const",
431                        "enum",
432                        "interface",
433                        "struct",
434                        "table",
435                        "union"
436                    ]
437                }
438            }
439        },
440        "library": {
441            "type": "object",
442            "required": [
443                "name",
444                "declarations"
445            ],
446            "properties": {
447                "name": {
448                    "$ref": "#/definitions/library-identifier"
449                },
450                "declarations": {
451                    "$ref": "#/definitions/declarations-map"
452                }
453            }
454        },
455        "type": {
456            "oneOf": [
457                {
458                    "$ref": "#/definitions/array-type"
459                },
460                {
461                    "$ref": "#/definitions/vector-type"
462                },
463                {
464                    "$ref": "#/definitions/string-type"
465                },
466                {
467                    "$ref": "#/definitions/handle-type"
468                },
469                {
470                    "$ref": "#/definitions/request-type"
471                },
472                {
473                    "$ref": "#/definitions/primitive-type"
474                },
475                {
476                    "$ref": "#/definitions/identifier-type"
477                }
478            ]
479        },
480        "array-type": {
481            "type": "object",
482            "required": [
483                "kind",
484                "element_type",
485                "element_count"
486            ],
487            "properties": {
488                "kind": {
489                    "type": "string",
490                    "enum": [
491                        "array"
492                    ]
493                },
494                "element_type": {
495                    "$ref": "#/definitions/type"
496                },
497                "element_count": {
498                    "$ref": "#/definitions/size"
499                }
500            }
501        },
502        "vector-type": {
503            "type": "object",
504            "required": [
505                "kind",
506                "element_type",
507                "nullable"
508            ],
509            "properties": {
510                "kind": {
511                    "type": "string",
512                    "enum": [
513                        "vector"
514                    ]
515                },
516                "element_type": {
517                    "$ref": "#/definitions/type"
518                },
519                "maybe_element_count": {
520                    "$ref": "#/definitions/size"
521                },
522                "nullable": {
523                    "type": "boolean"
524                }
525            }
526        },
527        "string-type": {
528            "type": "object",
529            "required": [
530                "kind",
531                "nullable"
532            ],
533            "properties": {
534                "kind": {
535                    "type": "string",
536                    "enum": [
537                        "string"
538                    ]
539                },
540                "maybe_element_count": {
541                    "$ref": "#/definitions/size"
542                },
543                "nullable": {
544                    "type": "boolean"
545                }
546            }
547        },
548        "handle-type": {
549            "type": "object",
550            "required": [
551                "kind",
552                "subtype",
553                "nullable"
554            ],
555            "properties": {
556                "kind": {
557                    "type": "string",
558                    "enum": [
559                        "handle"
560                    ]
561                },
562                "subtype": {
563                    "$ref": "#/definitions/handle-subtype"
564                },
565                "nullable": {
566                    "type": "boolean"
567                }
568            }
569        },
570        "request-type": {
571            "type": "object",
572            "required": [
573                "kind",
574                "subtype",
575                "nullable"
576            ],
577            "properties": {
578                "kind": {
579                    "type": "string",
580                    "enum": [
581                        "request"
582                    ]
583                },
584                "subtype": {
585                    "$ref": "#/definitions/compound-identifier"
586                },
587                "nullable": {
588                    "type": "boolean"
589                }
590            }
591        },
592        "attributes-list": {
593            "type": "array",
594            "items": {
595                "$ref": "#/definitions/attribute"
596            }
597        },
598        "attribute": {
599            "type": "object",
600            "required": [
601                "name",
602                "value"
603            ],
604            "properties": {
605                "name": {
606                    "type": "string"
607                },
608                "value": {
609                    "type": "string"
610                }
611            }
612        },
613        "primitive-type": {
614            "type": "object",
615            "required": [
616                "kind",
617                "subtype"
618            ],
619            "properties": {
620                "kind": {
621                    "type": "string",
622                    "enum": [
623                        "primitive"
624                    ]
625                },
626                "subtype": {
627                    "$ref": "#/definitions/primitive-subtype"
628                }
629            }
630        },
631        "identifier-type": {
632            "type": "object",
633            "required": [
634                "kind",
635                "identifier",
636                "nullable"
637            ],
638            "properties": {
639                "kind": {
640                    "type": "string",
641                    "enum": [
642                        "identifier"
643                    ]
644                },
645                "identifier": {
646                    "$ref": "#/definitions/compound-identifier"
647                },
648                "nullable": {
649                    "type": "boolean"
650                }
651            }
652        },
653        "constant": {
654            "oneOf": [
655                {
656                    "$ref": "#/definitions/identifier-constant"
657                },
658                {
659                    "$ref": "#/definitions/literal-constant"
660                }
661            ]
662        },
663        "identifier-constant": {
664            "type": "object",
665            "required": [
666                "kind",
667                "identifier"
668            ],
669            "properties": {
670                "kind": {
671                    "type": "string",
672                    "enum": [
673                        "identifier"
674                    ]
675                },
676                "identifier": {
677                    "$ref": "#/definitions/compound-identifier"
678                }
679            }
680        },
681        "literal-constant": {
682            "type": "object",
683            "required": [
684                "kind",
685                "literal"
686            ],
687            "properties": {
688                "kind": {
689                    "type": "string",
690                    "enum": [
691                        "literal"
692                    ]
693                },
694                "literal": {
695                    "$ref": "#/definitions/literal"
696                }
697            }
698        },
699        "literal": {
700            "oneOf": [
701                {
702                    "$ref": "#/definitions/string-literal"
703                },
704                {
705                    "$ref": "#/definitions/numeric-literal"
706                },
707                {
708                    "$ref": "#/definitions/true-literal"
709                },
710                {
711                    "$ref": "#/definitions/false-literal"
712                },
713                {
714                    "$ref": "#/definitions/default-literal"
715                }
716            ]
717        },
718        "string-literal": {
719            "type": "object",
720            "required": [
721                "kind",
722                "value"
723            ],
724            "properties": {
725                "kind": {
726                    "type": "string",
727                    "enum": [
728                        "string"
729                    ]
730                },
731                "value": {
732                    "type": "string"
733                }
734            }
735        },
736        "numeric-literal": {
737            "type": "object",
738            "required": [
739                "kind",
740                "value"
741            ],
742            "properties": {
743                "kind": {
744                    "type": "string",
745                    "enum": [
746                        "numeric"
747                    ]
748                },
749                "value": {
750                    "type": "string"
751                }
752            }
753        },
754        "true-literal": {
755            "type": "object",
756            "required": [
757                "kind"
758            ],
759            "properties": {
760                "kind": {
761                    "type": "string",
762                    "enum": [
763                        "true"
764                    ]
765                }
766            }
767        },
768        "false-literal": {
769            "type": "object",
770            "required": [
771                "kind"
772            ],
773            "properties": {
774                "kind": {
775                    "type": "string",
776                    "enum": [
777                        "false"
778                    ]
779                }
780            }
781        },
782        "default-literal": {
783            "type": "object",
784            "required": [
785                "kind"
786            ],
787            "properties": {
788                "kind": {
789                    "type": "string",
790                    "enum": [
791                        "default"
792                    ]
793                }
794            }
795        },
796        "handle-subtype": {
797            "type": "string",
798            "enum": [
799                "handle",
800                "process",
801                "thread",
802                "vmo",
803                "channel",
804                "event",
805                "port",
806                "interrupt",
807                "log",
808                "socket",
809                "resource",
810                "eventpair",
811                "job",
812                "vmar",
813                "fifo",
814                "guest",
815                "timer"
816            ]
817        },
818        "primitive-subtype": {
819            "oneOf": [
820                {
821                    "type": "string",
822                    "enum": [
823                        "bool",
824                        "float32",
825                        "float64"
826                    ]
827                },
828                {
829                    "$ref": "#/definitions/integer-type"
830                }
831            ]
832        },
833        "integer-type": {
834            "type": "string",
835            "enum": [
836                "int8",
837                "int16",
838                "int32",
839                "int64",
840                "uint8",
841                "uint16",
842                "uint32",
843                "uint64"
844            ]
845        },
846        "ordinal": {
847            "type": "integer",
848            "minimum": 1,
849            "maximum": 4294967295
850        },
851        "compound-identifier": {
852            "type": "string",
853            "pattern": "([_A-Za-z][_A-Za-z0-9]*-)*[_A-Za-z][_A-Za-z0-9]*/[_A-Za-z][_A-Za-z0-9]*"
854        },
855        "identifier": {
856            "type": "string",
857            "pattern": "^[_A-Za-z][_A-Za-z0-9]*$"
858        },
859        "library-identifier": {
860            "type": "string",
861            "pattern": "([_A-Za-z][_A-Za-z0-9]*-)*[_A-Za-z][_A-Za-z0-9]*"
862        },
863        "max-handles": {
864            "type": "integer",
865            "minimum": 0,
866            "maximum": 4294967295
867        },
868        "size": {
869            "type": "integer",
870            "minimum": 0,
871            "maximum": 4294967295
872        },
873        "version": {
874            "type": "string",
875            "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
876        }
877    },
878    "additionalProperties": false
879}