blob: 672816bdbfe7cb18906cd2fa0d79378e55c8fa2e [file] [log] [blame]
Austin Schuhe89fa2d2019-08-14 20:24:23 -07001// This schema defines objects that represent a parsed schema, like
2// the binary version of a .fbs file.
3// This could be used to operate on unknown FlatBuffers at runtime.
4// It can even ... represent itself (!)
5
6namespace reflection;
7
8// These must correspond to the enum in idl.h.
9enum BaseType : byte {
10 None,
11 UType,
12 Bool,
13 Byte,
14 UByte,
15 Short,
16 UShort,
17 Int,
18 UInt,
19 Long,
20 ULong,
21 Float,
22 Double,
23 String,
24 Vector,
25 Obj, // Used for tables & structs.
26 Union,
Austin Schuh272c6132020-11-14 16:37:52 -080027 Array,
28
29 // Add any new type above this value.
30 MaxBaseType
Austin Schuhe89fa2d2019-08-14 20:24:23 -070031}
32
33table Type {
Austin Schuhf13042b2020-11-25 23:11:41 -080034 base_type:BaseType (id: 0);
35 element:BaseType = None (id: 1); // Only if base_type == Vector
36 // or base_type == Array.
37 index:int = -1 (id: 2); // If base_type == Object, index into "objects" below.
38 // If base_type == Union, UnionType, or integral derived
39 // from an enum, index into "enums" below.
Austin Schuha1d006e2022-09-14 21:50:42 -070040 // If base_type == Vector && element == Union or UnionType.
Austin Schuhf13042b2020-11-25 23:11:41 -080041 fixed_length:uint16 = 0 (id: 3); // Only if base_type == Array.
James Kuszmauldac091f2022-03-22 09:35:06 -070042 /// The size (octets) of the `base_type` field.
43 base_size:uint = 4 (id: 4); // 4 Is a common size due to offsets being that size.
44 /// The size (octets) of the `element` field, if present.
45 element_size:uint = 0 (id: 5);
Austin Schuhe89fa2d2019-08-14 20:24:23 -070046}
47
48table KeyValue {
Austin Schuhf13042b2020-11-25 23:11:41 -080049 key:string (required, key, id: 0);
50 value:string (id: 1);
Austin Schuhe89fa2d2019-08-14 20:24:23 -070051}
52
53table EnumVal {
James Kuszmauldac091f2022-03-22 09:35:06 -070054 name:string (id: 0, required);
55 value:long (id: 1, key);
56 object:Object (id: 2, deprecated);
Austin Schuhf13042b2020-11-25 23:11:41 -080057 union_type:Type (id: 3);
58 documentation:[string] (id: 4);
James Kuszmaul65541cb2022-11-08 14:53:47 -080059 attributes:[KeyValue] (id: 5);
Austin Schuhe89fa2d2019-08-14 20:24:23 -070060}
61
62table Enum {
James Kuszmauldac091f2022-03-22 09:35:06 -070063 name:string (id: 0, required, key);
64 values:[EnumVal] (id: 1, required); // In order of their values.
Austin Schuhf13042b2020-11-25 23:11:41 -080065 is_union:bool = false (id: 2);
James Kuszmauldac091f2022-03-22 09:35:06 -070066 underlying_type:Type (id: 3, required);
Austin Schuhf13042b2020-11-25 23:11:41 -080067 attributes:[KeyValue] (id: 4);
68 documentation:[string] (id: 5);
James Kuszmauldac091f2022-03-22 09:35:06 -070069 /// File that this Enum is declared in.
70 declaration_file: string (id: 6);
Austin Schuhe89fa2d2019-08-14 20:24:23 -070071}
72
73table Field {
James Kuszmauldac091f2022-03-22 09:35:06 -070074 name:string (id: 0, required, key);
75 type:Type (id: 1, required);
Austin Schuhf13042b2020-11-25 23:11:41 -080076 id:ushort (id: 2);
77 offset:ushort (id: 3); // Offset into the vtable for tables, or into the struct.
78 default_integer:long = 0 (id: 4);
79 default_real:double = 0.0 (id: 5);
80 deprecated:bool = false (id: 6);
81 required:bool = false (id: 7);
82 key:bool = false (id: 8);
83 attributes:[KeyValue] (id: 9);
84 documentation:[string] (id: 10);
85 optional:bool = false (id: 11);
James Kuszmauldac091f2022-03-22 09:35:06 -070086 /// Number of padding octets to always add after this field. Structs only.
James Kuszmaul65541cb2022-11-08 14:53:47 -080087 padding:uint16 = 0 (id: 12);
Austin Schuhe89fa2d2019-08-14 20:24:23 -070088}
89
90table Object { // Used for both tables and structs.
James Kuszmauldac091f2022-03-22 09:35:06 -070091 name:string (id: 0, required, key);
92 fields:[Field] (id: 1, required); // Sorted.
Austin Schuhf13042b2020-11-25 23:11:41 -080093 is_struct:bool = false (id: 2);
94 minalign:int (id: 3);
95 bytesize:int (id: 4); // For structs.
96 attributes:[KeyValue] (id: 5);
97 documentation:[string] (id: 6);
James Kuszmauldac091f2022-03-22 09:35:06 -070098 /// File that this Object is declared in.
99 declaration_file: string (id: 7);
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700100}
101
102table RPCCall {
Austin Schuhf13042b2020-11-25 23:11:41 -0800103 name:string (required, key, id: 0);
104 request:Object (required, id: 1); // must be a table (not a struct)
105 response:Object (required, id: 2); // must be a table (not a struct)
106 attributes:[KeyValue] (id: 3);
107 documentation:[string] (id: 4);
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700108}
109
110table Service {
James Kuszmauldac091f2022-03-22 09:35:06 -0700111 name:string (id: 0, required, key);
Austin Schuhf13042b2020-11-25 23:11:41 -0800112 calls:[RPCCall] (id: 1);
113 attributes:[KeyValue] (id: 2);
114 documentation:[string] (id: 3);
James Kuszmauldac091f2022-03-22 09:35:06 -0700115 /// File that this Service is declared in.
116 declaration_file: string (id: 4);
117}
118
119/// New schema language features that are not supported by old code generators.
120enum AdvancedFeatures : ulong (bit_flags) {
121 AdvancedArrayFeatures,
122 AdvancedUnionFeatures,
123 OptionalScalars,
124 DefaultVectorsAndStrings,
125}
126
127/// File specific information.
128/// Symbols declared within a file may be recovered by iterating over all
129/// symbols and examining the `declaration_file` field.
130table SchemaFile {
131 /// Filename, relative to project root.
132 filename:string (id: 0, required, key);
133 /// Names of included files, relative to project root.
134 included_filenames:[string] (id: 1);
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700135}
136
137table Schema {
James Kuszmauldac091f2022-03-22 09:35:06 -0700138 objects:[Object] (id: 0, required); // Sorted.
139 enums:[Enum] (id: 1, required); // Sorted.
Austin Schuhf13042b2020-11-25 23:11:41 -0800140 file_ident:string (id: 2);
141 file_ext:string (id: 3);
142 root_table:Object (id: 4);
143 services:[Service] (id: 5); // Sorted.
James Kuszmauldac091f2022-03-22 09:35:06 -0700144 advanced_features:AdvancedFeatures (id: 6);
145 /// All the files used in this compilation. Files are relative to where
146 /// flatc was invoked.
147 fbs_files:[SchemaFile] (id: 7); // Sorted.
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700148}
149
150root_type Schema;
151
152file_identifier "BFBS";
153file_extension "bfbs";