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}