blob: cc0695961ba8f467868f00a42baee7e15a82bf4e [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.
40 fixed_length:uint16 = 0 (id: 3); // Only if base_type == Array.
James Kuszmauldac091f2022-03-22 09:35:06 -070041 /// The size (octets) of the `base_type` field.
42 base_size:uint = 4 (id: 4); // 4 Is a common size due to offsets being that size.
43 /// The size (octets) of the `element` field, if present.
44 element_size:uint = 0 (id: 5);
Austin Schuhe89fa2d2019-08-14 20:24:23 -070045}
46
47table KeyValue {
Austin Schuhf13042b2020-11-25 23:11:41 -080048 key:string (required, key, id: 0);
49 value:string (id: 1);
Austin Schuhe89fa2d2019-08-14 20:24:23 -070050}
51
52table EnumVal {
James Kuszmauldac091f2022-03-22 09:35:06 -070053 name:string (id: 0, required);
54 value:long (id: 1, key);
55 object:Object (id: 2, deprecated);
Austin Schuhf13042b2020-11-25 23:11:41 -080056 union_type:Type (id: 3);
57 documentation:[string] (id: 4);
Austin Schuhe89fa2d2019-08-14 20:24:23 -070058}
59
60table Enum {
James Kuszmauldac091f2022-03-22 09:35:06 -070061 name:string (id: 0, required, key);
62 values:[EnumVal] (id: 1, required); // In order of their values.
Austin Schuhf13042b2020-11-25 23:11:41 -080063 is_union:bool = false (id: 2);
James Kuszmauldac091f2022-03-22 09:35:06 -070064 underlying_type:Type (id: 3, required);
Austin Schuhf13042b2020-11-25 23:11:41 -080065 attributes:[KeyValue] (id: 4);
66 documentation:[string] (id: 5);
James Kuszmauldac091f2022-03-22 09:35:06 -070067 /// File that this Enum is declared in.
68 declaration_file: string (id: 6);
Austin Schuhe89fa2d2019-08-14 20:24:23 -070069}
70
71table Field {
James Kuszmauldac091f2022-03-22 09:35:06 -070072 name:string (id: 0, required, key);
73 type:Type (id: 1, required);
Austin Schuhf13042b2020-11-25 23:11:41 -080074 id:ushort (id: 2);
75 offset:ushort (id: 3); // Offset into the vtable for tables, or into the struct.
76 default_integer:long = 0 (id: 4);
77 default_real:double = 0.0 (id: 5);
78 deprecated:bool = false (id: 6);
79 required:bool = false (id: 7);
80 key:bool = false (id: 8);
81 attributes:[KeyValue] (id: 9);
82 documentation:[string] (id: 10);
83 optional:bool = false (id: 11);
James Kuszmauldac091f2022-03-22 09:35:06 -070084 /// Number of padding octets to always add after this field. Structs only.
85 padding:uint16 = 0 (id: 12);
Austin Schuhe89fa2d2019-08-14 20:24:23 -070086}
87
88table Object { // Used for both tables and structs.
James Kuszmauldac091f2022-03-22 09:35:06 -070089 name:string (id: 0, required, key);
90 fields:[Field] (id: 1, required); // Sorted.
Austin Schuhf13042b2020-11-25 23:11:41 -080091 is_struct:bool = false (id: 2);
92 minalign:int (id: 3);
93 bytesize:int (id: 4); // For structs.
94 attributes:[KeyValue] (id: 5);
95 documentation:[string] (id: 6);
James Kuszmauldac091f2022-03-22 09:35:06 -070096 /// File that this Object is declared in.
97 declaration_file: string (id: 7);
Austin Schuhe89fa2d2019-08-14 20:24:23 -070098}
99
100table RPCCall {
Austin Schuhf13042b2020-11-25 23:11:41 -0800101 name:string (required, key, id: 0);
102 request:Object (required, id: 1); // must be a table (not a struct)
103 response:Object (required, id: 2); // must be a table (not a struct)
104 attributes:[KeyValue] (id: 3);
105 documentation:[string] (id: 4);
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700106}
107
108table Service {
James Kuszmauldac091f2022-03-22 09:35:06 -0700109 name:string (id: 0, required, key);
Austin Schuhf13042b2020-11-25 23:11:41 -0800110 calls:[RPCCall] (id: 1);
111 attributes:[KeyValue] (id: 2);
112 documentation:[string] (id: 3);
James Kuszmauldac091f2022-03-22 09:35:06 -0700113 /// File that this Service is declared in.
114 declaration_file: string (id: 4);
115}
116
117/// New schema language features that are not supported by old code generators.
118enum AdvancedFeatures : ulong (bit_flags) {
119 AdvancedArrayFeatures,
120 AdvancedUnionFeatures,
121 OptionalScalars,
122 DefaultVectorsAndStrings,
123}
124
125/// File specific information.
126/// Symbols declared within a file may be recovered by iterating over all
127/// symbols and examining the `declaration_file` field.
128table SchemaFile {
129 /// Filename, relative to project root.
130 filename:string (id: 0, required, key);
131 /// Names of included files, relative to project root.
132 included_filenames:[string] (id: 1);
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700133}
134
135table Schema {
James Kuszmauldac091f2022-03-22 09:35:06 -0700136 objects:[Object] (id: 0, required); // Sorted.
137 enums:[Enum] (id: 1, required); // Sorted.
Austin Schuhf13042b2020-11-25 23:11:41 -0800138 file_ident:string (id: 2);
139 file_ext:string (id: 3);
140 root_table:Object (id: 4);
141 services:[Service] (id: 5); // Sorted.
James Kuszmauldac091f2022-03-22 09:35:06 -0700142 advanced_features:AdvancedFeatures (id: 6);
143 /// All the files used in this compilation. Files are relative to where
144 /// flatc was invoked.
145 fbs_files:[SchemaFile] (id: 7); // Sorted.
Austin Schuhe89fa2d2019-08-14 20:24:23 -0700146}
147
148root_type Schema;
149
150file_identifier "BFBS";
151file_extension "bfbs";