Document the JSON representation of the schema AST
This commit is contained in:
Родитель
48e1a55847
Коммит
1e4ed55a1f
|
@ -23,6 +23,7 @@ $endif$
|
||||||
}
|
}
|
||||||
code {
|
code {
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
|
font-family: "Courier New", monospace, serif;
|
||||||
}
|
}
|
||||||
td.lineNumbers { width: 40px; }
|
td.lineNumbers { width: 40px; }
|
||||||
div#all {
|
div#all {
|
||||||
|
|
|
@ -23,6 +23,7 @@ $endif$
|
||||||
}
|
}
|
||||||
code {
|
code {
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
|
font-family: "Courier New", monospace, serif;
|
||||||
}
|
}
|
||||||
td.lineNumbers { width: 40px; }
|
td.lineNumbers { width: 40px; }
|
||||||
div#all {
|
div#all {
|
||||||
|
|
|
@ -70,7 +70,7 @@ if (Haskell_PANDOC_EXECUTABLE)
|
||||||
OUTPUT_DIR manual)
|
OUTPUT_DIR manual)
|
||||||
|
|
||||||
add_pandoc_markdown (src/compiler.md
|
add_pandoc_markdown (src/compiler.md
|
||||||
CODE "javascript"
|
CODE cpp
|
||||||
OPTIONS --self-contained --table-of-contents
|
OPTIONS --self-contained --table-of-contents
|
||||||
OUTPUT_DIR manual)
|
OUTPUT_DIR manual)
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ if (Haskell_PANDOC_EXECUTABLE)
|
||||||
OUTPUT_DIR manual)
|
OUTPUT_DIR manual)
|
||||||
|
|
||||||
add_pandoc_markdown (src/reference_index.md
|
add_pandoc_markdown (src/reference_index.md
|
||||||
CODE "cpp"
|
CODE cpp
|
||||||
OPTIONS --self-contained
|
OPTIONS --self-contained
|
||||||
OUTPUT_NAME index
|
OUTPUT_NAME index
|
||||||
OUTPUT_DIR reference)
|
OUTPUT_DIR reference)
|
||||||
|
|
|
@ -18,7 +18,7 @@ Basic example
|
||||||
=============
|
=============
|
||||||
|
|
||||||
In Bond data schemas are defined using idl-like
|
In Bond data schemas are defined using idl-like
|
||||||
[syntax](../../manual/bond_cpp.html#idl-syntax):
|
[syntax](../../manual/compiler.html#idl-syntax):
|
||||||
|
|
||||||
namespace example
|
namespace example
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ Bond is published on GitHub at [https://github.com/Microsoft/bond/](https://gith
|
||||||
Basic example
|
Basic example
|
||||||
=============
|
=============
|
||||||
|
|
||||||
In Bond data schemas are defined using idl-like [syntax](#idl-syntax):
|
In Bond data schemas are defined using idl-like [syntax](compiler.html#idl-syntax):
|
||||||
|
|
||||||
namespace example
|
namespace example
|
||||||
|
|
||||||
|
@ -410,7 +410,7 @@ class][bonded_reference]:
|
||||||
|
|
||||||
The class template has two parameters. The first one, `T`, represents schema
|
The class template has two parameters. The first one, `T`, represents schema
|
||||||
(or type) of the data. Usually it is a struct defined via Bond
|
(or type) of the data. Usually it is a struct defined via Bond
|
||||||
[IDL](#idl-syntax) but it can also be `void` (see
|
[IDL](compiler.html#idl-syntax) but it can also be `void` (see
|
||||||
[`bonded<void>`][bonded_void_reference]) if we want to work with data for which
|
[`bonded<void>`][bonded_void_reference]) if we want to work with data for which
|
||||||
schema is not known at compile-time. The second parameter, `Reader`, specifies
|
schema is not known at compile-time. The second parameter, `Reader`, specifies
|
||||||
representation of the data. The default, `ProtocolReader` is a variant type
|
representation of the data. The default, `ProtocolReader` is a variant type
|
||||||
|
@ -1165,277 +1165,6 @@ See examples:
|
||||||
- `examples/cpp/core/simple_json`
|
- `examples/cpp/core/simple_json`
|
||||||
|
|
||||||
|
|
||||||
IDL syntax
|
|
||||||
==========
|
|
||||||
|
|
||||||
A Bond schema definition file can contain the following elements:
|
|
||||||
|
|
||||||
- Import statements
|
|
||||||
- Namespace definition
|
|
||||||
- Forward declarations
|
|
||||||
- Definitions
|
|
||||||
- enum
|
|
||||||
- forward declaration
|
|
||||||
- struct
|
|
||||||
- generics
|
|
||||||
- struct view
|
|
||||||
- Custom attributes
|
|
||||||
- Comments
|
|
||||||
|
|
||||||
|
|
||||||
Import statements
|
|
||||||
------------------
|
|
||||||
|
|
||||||
In order to use types defined in another schema definition file, the other file
|
|
||||||
needs to be explicitly imported. Schema file can contain zero or more import
|
|
||||||
statements and they must appear at the top of the file:
|
|
||||||
|
|
||||||
import "file.bond"
|
|
||||||
|
|
||||||
The file being imported can be specified using a partial path which is resolved
|
|
||||||
by Bond compiler relative to the directory containing the schema file being
|
|
||||||
compiled and any import path(s) specified using the --import-dir option(s)
|
|
||||||
passed to gbc.
|
|
||||||
|
|
||||||
See example: `examples/cpp/core/import`.
|
|
||||||
|
|
||||||
Namespace definition
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
All schema types are always defined within a namespace. Namespace scope starts
|
|
||||||
with namespace definition statement and ends at the end of the file.
|
|
||||||
|
|
||||||
namespace some.unique.name
|
|
||||||
|
|
||||||
|
|
||||||
Enum definition
|
|
||||||
---------------
|
|
||||||
|
|
||||||
Bond enums are very similar to C++ enums, both in semantics and syntax used to
|
|
||||||
define them:
|
|
||||||
|
|
||||||
enum Protocols
|
|
||||||
{
|
|
||||||
TCP,
|
|
||||||
UDP = 10
|
|
||||||
}
|
|
||||||
|
|
||||||
On the wire values of enums types are equivalent to 32-bit signed integers.
|
|
||||||
|
|
||||||
|
|
||||||
Forward declaration
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
In order to define recursive schemas, such as trees, it may be necessary to
|
|
||||||
declare a struct before it is defined. A forward declaration statement serves
|
|
||||||
this purpose:
|
|
||||||
|
|
||||||
struct Node;
|
|
||||||
|
|
||||||
Forward declared structs can be used in field declarations as the base type for
|
|
||||||
nullable\<T\> and bonded\<T\> or the element type of a container.
|
|
||||||
|
|
||||||
struct Node;
|
|
||||||
|
|
||||||
struct Node
|
|
||||||
{
|
|
||||||
0: nullable<Node> left;
|
|
||||||
1: nullable<Node> right;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Struct definition
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
Struct definition consists of a struct name, an optional base struct, and zero
|
|
||||||
or more fields.
|
|
||||||
|
|
||||||
struct Example : Base
|
|
||||||
{
|
|
||||||
0: uint32 fieldName = 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
Field definition consists of an ordinal, type, name and optional default value.
|
|
||||||
Field type can be:
|
|
||||||
|
|
||||||
- Basic type: `bool`, `uint8`, `uint16`, `uint32`, `uint64`, `int8`, `int16`,
|
|
||||||
`int32`, `int64`, `float`, `double`, `string`, `wstring`.
|
|
||||||
|
|
||||||
- Container: `blob`, `list<T>`, `vector<T>`, `set<T>`, `map<K, T>`,
|
|
||||||
`nullable<T>`.
|
|
||||||
|
|
||||||
- User-defined type: enum, struct or `bonded<T>` where T is a struct.
|
|
||||||
|
|
||||||
An optional default value can be specified for fields of basic types. For
|
|
||||||
integers the default can be specified as either a decimal number or a
|
|
||||||
hexadecimal number prefixed with `0x`. The only explicit default value allowed
|
|
||||||
for containers is [`nothing`](#default-value-of-nothing). Enum fields must have
|
|
||||||
an explicit default value which must be one of the enum named constants.
|
|
||||||
|
|
||||||
Names of structs and enums defined in another namespace must be qualified with
|
|
||||||
the namespace name:
|
|
||||||
|
|
||||||
import "bond/core/bond.bond"
|
|
||||||
|
|
||||||
namespace example
|
|
||||||
|
|
||||||
struct Example
|
|
||||||
{
|
|
||||||
0: bond.GUID id;
|
|
||||||
1: bond.BondDataType type = BT_UNAVAILABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
Structs can be defined as sealed. Sealed structs can't be inherited from:
|
|
||||||
|
|
||||||
sealed struct Example
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
Generics
|
|
||||||
--------
|
|
||||||
|
|
||||||
Generic structs are parameterized with one or more type parameters which can be
|
|
||||||
used within the struct definition in any place where a concrete type could be
|
|
||||||
used (e.g. base struct, field type, container element type, parameter of a
|
|
||||||
generic struct).
|
|
||||||
|
|
||||||
struct Example<T1, T2> : T1
|
|
||||||
{
|
|
||||||
0: T1 field;
|
|
||||||
1: list<T2> list;
|
|
||||||
2: Generic<T2> generic;
|
|
||||||
}
|
|
||||||
|
|
||||||
Usage of a type parameter within a generic struct definition may implicitly
|
|
||||||
constrain what type(s) can be used to instantiate the generic struct:
|
|
||||||
|
|
||||||
struct Example<T>
|
|
||||||
{
|
|
||||||
// The default value of 10 implicitly constrains T to numeric types
|
|
||||||
0: T x = 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
Using a type parameter in a [`nullable`](#nullable-types) or as the type of
|
|
||||||
a field with default value of [`nothing`](#default-value-of-nothing) constrains
|
|
||||||
the type parameter to be non-scalar type. If this is undesired then explicit
|
|
||||||
constraint to value type can be specified in the generic schema definition:
|
|
||||||
|
|
||||||
struct Example<T : value>
|
|
||||||
{
|
|
||||||
0: nullable<T> x;
|
|
||||||
1: T y = nothing;
|
|
||||||
}
|
|
||||||
|
|
||||||
When instantiating a generic struct all type parameters must be concrete types.
|
|
||||||
Bond IDL doesn't support the equivalent of C++ template template parameters.
|
|
||||||
|
|
||||||
See examples:
|
|
||||||
|
|
||||||
- `examples/cpp/core/generics`
|
|
||||||
- `examples/cpp/core/generic_tree`
|
|
||||||
|
|
||||||
|
|
||||||
Type aliases
|
|
||||||
------------
|
|
||||||
|
|
||||||
The syntax to define type aliases is very similar to C++:
|
|
||||||
|
|
||||||
using time = int64;
|
|
||||||
using array<T> = vector<T>;
|
|
||||||
|
|
||||||
An alias can be used in any context where the aliased type could be used,
|
|
||||||
including a definition of another alias:
|
|
||||||
|
|
||||||
using times = array<time>;
|
|
||||||
|
|
||||||
Type aliases can optionally be [mapped to custom types](#custom-type-mappings)
|
|
||||||
in the generated code.
|
|
||||||
|
|
||||||
See examples:
|
|
||||||
|
|
||||||
- `examples/cpp/core/time_alias`
|
|
||||||
- `examples/cpp/core/multiprecision`
|
|
||||||
- `examples/cpp/core/string_ref`
|
|
||||||
- `examples/cpp/core/container_of_pointers`
|
|
||||||
- `examples/cpp/core/static_array`
|
|
||||||
|
|
||||||
Struct views
|
|
||||||
------------
|
|
||||||
|
|
||||||
A view definition is syntactic sugar to define a struct that has a subset of
|
|
||||||
the fields of another struct:
|
|
||||||
|
|
||||||
struct Example
|
|
||||||
{
|
|
||||||
0: int16 x;
|
|
||||||
1: string y;
|
|
||||||
2: list<bool> z;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct View view_of Example
|
|
||||||
{
|
|
||||||
x,z;
|
|
||||||
}
|
|
||||||
|
|
||||||
In the above example, the definition of `View` is equivalent to:
|
|
||||||
|
|
||||||
struct View
|
|
||||||
{
|
|
||||||
0: int16 x;
|
|
||||||
2: list<bool> z;
|
|
||||||
}
|
|
||||||
|
|
||||||
A view of a generic struct is also a generic struct with the same number of
|
|
||||||
type parameters.
|
|
||||||
|
|
||||||
A view of a sealed struct is always sealed. A view of non-sealed struct can be
|
|
||||||
defined to be sealed:
|
|
||||||
|
|
||||||
sealed struct View view_of Example
|
|
||||||
{
|
|
||||||
x,
|
|
||||||
z;
|
|
||||||
}
|
|
||||||
|
|
||||||
See example: `examples/cpp/core/schema_view`
|
|
||||||
|
|
||||||
|
|
||||||
Custom attributes
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
Struct, enum and field definitions can be annotated with custom attributes
|
|
||||||
which are in effect name, string-values pairs:
|
|
||||||
|
|
||||||
[Validate("True")]
|
|
||||||
struct Example
|
|
||||||
{
|
|
||||||
[Max("100")]
|
|
||||||
0: uint32 value;
|
|
||||||
}
|
|
||||||
|
|
||||||
Attributes are available in code generation templates and thus can be used to
|
|
||||||
drive custom code generation. They are also available to applications via
|
|
||||||
[compile-time](#compile-time-schema) and [runtime](#runtime-schema) schema, and
|
|
||||||
as `Metadata` argument in [transforms](#transforms) and [protocols](#protocols).
|
|
||||||
|
|
||||||
See example: `examples/cpp/core/attributes`
|
|
||||||
|
|
||||||
|
|
||||||
Comments
|
|
||||||
--------
|
|
||||||
|
|
||||||
Bond IDL supports C++ style comments:
|
|
||||||
|
|
||||||
/*
|
|
||||||
Multi-line
|
|
||||||
comment
|
|
||||||
*/
|
|
||||||
struct Example
|
|
||||||
{
|
|
||||||
// One line commet
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Custom type mappings
|
Custom type mappings
|
||||||
====================
|
====================
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ Basic example
|
||||||
=============
|
=============
|
||||||
|
|
||||||
In Bond data schemas are defined using idl-like
|
In Bond data schemas are defined using idl-like
|
||||||
[syntax](bond_cpp.html#idl-syntax):
|
[syntax](compiler.html#idl-syntax):
|
||||||
|
|
||||||
namespace Examples
|
namespace Examples
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,629 @@
|
||||||
|
% Bond compiler
|
||||||
|
|
||||||
Command line options
|
Command line options
|
||||||
====================
|
====================
|
||||||
|
|
||||||
<div class="sourceCode"><object width="702" height="1000" data="gbc.html"/></div>
|
<div class="sourceCode"><object width="702" height="1000" data="gbc.html"/></div>
|
||||||
|
|
||||||
|
IDL syntax
|
||||||
|
==========
|
||||||
|
|
||||||
|
A Bond schema definition file can contain the following elements:
|
||||||
|
|
||||||
|
- Import statements
|
||||||
|
- Namespace definition
|
||||||
|
- Declarations
|
||||||
|
- enum
|
||||||
|
- forward declaration
|
||||||
|
- struct
|
||||||
|
- generics
|
||||||
|
- struct view
|
||||||
|
- Custom attributes
|
||||||
|
- Comments
|
||||||
|
|
||||||
|
|
||||||
|
Import statements
|
||||||
|
------------------
|
||||||
|
|
||||||
|
In order to use types defined in another schema definition file, the other file
|
||||||
|
needs to be explicitly imported. Schema file can contain zero or more import
|
||||||
|
statements and they must appear at the top of the file:
|
||||||
|
|
||||||
|
import "file.bond"
|
||||||
|
|
||||||
|
The file being imported can be specified using a partial path which is resolved
|
||||||
|
by Bond compiler relative to the directory containing the schema file being
|
||||||
|
compiled and any import path(s) specified using the --import-dir option(s)
|
||||||
|
passed to gbc.
|
||||||
|
|
||||||
|
See examples:
|
||||||
|
|
||||||
|
- `examples/cpp/core/import`
|
||||||
|
- `examples/cs/core/import`
|
||||||
|
|
||||||
|
Namespace definition
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
All schema types are always defined within a namespace. Namespace scope starts
|
||||||
|
with namespace definition statement and ends at the end of the file.
|
||||||
|
|
||||||
|
namespace some.unique.name
|
||||||
|
|
||||||
|
|
||||||
|
Enum definition
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Bond enums are very similar to C++ enums, both in semantics and syntax used to
|
||||||
|
define them:
|
||||||
|
|
||||||
|
enum Protocols
|
||||||
|
{
|
||||||
|
TCP,
|
||||||
|
UDP = 10
|
||||||
|
}
|
||||||
|
|
||||||
|
On the wire values of enums types are equivalent to 32-bit signed integers.
|
||||||
|
|
||||||
|
|
||||||
|
Forward declaration
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
In order to define recursive schemas, such as trees, it may be necessary to
|
||||||
|
declare a struct before it is defined. A forward declaration statement serves
|
||||||
|
this purpose:
|
||||||
|
|
||||||
|
struct Node;
|
||||||
|
|
||||||
|
Forward declared structs can be used in field declarations as the base type for
|
||||||
|
nullable\<T\> and bonded\<T\> or the element type of a container.
|
||||||
|
|
||||||
|
struct Node;
|
||||||
|
|
||||||
|
struct Node
|
||||||
|
{
|
||||||
|
0: nullable<Node> left;
|
||||||
|
1: nullable<Node> right;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Struct definition
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Struct definition consists of a struct name, an optional base struct, and zero
|
||||||
|
or more fields.
|
||||||
|
|
||||||
|
struct Example : Base
|
||||||
|
{
|
||||||
|
0: uint32 fieldName = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
Field definition consists of an ordinal, type, name and optional default value.
|
||||||
|
Field type can be:
|
||||||
|
|
||||||
|
- Basic type: `bool`, `uint8`, `uint16`, `uint32`, `uint64`, `int8`, `int16`,
|
||||||
|
`int32`, `int64`, `float`, `double`, `string`, `wstring`.
|
||||||
|
|
||||||
|
- Container: `blob`, `list<T>`, `vector<T>`, `set<T>`, `map<K, T>`,
|
||||||
|
`nullable<T>`.
|
||||||
|
|
||||||
|
- User-defined type: enum, struct or `bonded<T>` where T is a struct.
|
||||||
|
|
||||||
|
An optional default value can be specified for fields of basic types. For
|
||||||
|
integers the default can be specified as either a decimal number or a
|
||||||
|
hexadecimal number prefixed with `0x`. The only explicit default value allowed
|
||||||
|
for containers is [`nothing`](#default-value-of-nothing). Enum fields must have
|
||||||
|
an explicit default value which must be one of the enum named constants.
|
||||||
|
|
||||||
|
Names of structs and enums defined in another namespace must be qualified with
|
||||||
|
the namespace name:
|
||||||
|
|
||||||
|
import "bond/core/bond.bond"
|
||||||
|
|
||||||
|
namespace example
|
||||||
|
|
||||||
|
struct Example
|
||||||
|
{
|
||||||
|
0: bond.GUID id;
|
||||||
|
1: bond.BondDataType type = BT_UNAVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Generics
|
||||||
|
--------
|
||||||
|
|
||||||
|
Generic structs are parameterized with one or more type parameters which can be
|
||||||
|
used within the struct definition in any place where a concrete type could be
|
||||||
|
used (e.g. base struct, field type, container element type, parameter of a
|
||||||
|
generic struct).
|
||||||
|
|
||||||
|
struct Example<T1, T2> : T1
|
||||||
|
{
|
||||||
|
0: T1 field;
|
||||||
|
1: list<T2> list;
|
||||||
|
2: Generic<T2> generic;
|
||||||
|
}
|
||||||
|
|
||||||
|
Usage of a type parameter within a generic struct definition may implicitly
|
||||||
|
constrain what type(s) can be used to instantiate the generic struct:
|
||||||
|
|
||||||
|
struct Example<T>
|
||||||
|
{
|
||||||
|
// The default value of 10 implicitly constrains T to numeric types
|
||||||
|
0: T x = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
Using a type parameter in a [`nullable`](#nullable-types) or as the type of
|
||||||
|
a field with default value of [`nothing`](#default-value-of-nothing) constrains
|
||||||
|
the type parameter to be non-scalar type. If this is undesired then explicit
|
||||||
|
constraint to value type can be specified in the generic schema definition:
|
||||||
|
|
||||||
|
struct Example<T : value>
|
||||||
|
{
|
||||||
|
0: nullable<T> x;
|
||||||
|
1: T y = nothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
When instantiating a generic struct all type parameters must be concrete types.
|
||||||
|
Bond IDL doesn't support the equivalent of C++ template template parameters.
|
||||||
|
|
||||||
|
See examples:
|
||||||
|
|
||||||
|
- `examples/cpp/core/generics`
|
||||||
|
- `examples/cs/core/generics`
|
||||||
|
- `examples/cpp/core/generic_tree`
|
||||||
|
|
||||||
|
|
||||||
|
Type aliases
|
||||||
|
------------
|
||||||
|
|
||||||
|
The syntax to define type aliases is very similar to C++:
|
||||||
|
|
||||||
|
using time = int64;
|
||||||
|
using array<T> = vector<T>;
|
||||||
|
|
||||||
|
An alias can be used in any context where the aliased type could be used,
|
||||||
|
including a definition of another alias:
|
||||||
|
|
||||||
|
using times = array<time>;
|
||||||
|
|
||||||
|
Type aliases can optionally be [mapped to custom types](#custom-type-mappings)
|
||||||
|
in the generated code.
|
||||||
|
|
||||||
|
See examples:
|
||||||
|
|
||||||
|
- `examples/cpp/core/time_alias`
|
||||||
|
- `examples/cpp/core/multiprecision`
|
||||||
|
- `examples/cpp/core/string_ref`
|
||||||
|
- `examples/cpp/core/container_of_pointers`
|
||||||
|
- `examples/cpp/core/static_array`
|
||||||
|
- `examples/cs/core/date_time`
|
||||||
|
- `examples/cs/core/decimal`
|
||||||
|
- `examples/cs/core/guid`
|
||||||
|
- `examples/cs/core/container_alias`
|
||||||
|
|
||||||
|
Struct views
|
||||||
|
------------
|
||||||
|
|
||||||
|
A view definition is syntactic sugar to define a struct that has a subset of
|
||||||
|
the fields of another struct:
|
||||||
|
|
||||||
|
struct Example
|
||||||
|
{
|
||||||
|
0: int16 x;
|
||||||
|
1: string y;
|
||||||
|
2: list<bool> z;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct View view_of Example
|
||||||
|
{
|
||||||
|
x,z;
|
||||||
|
}
|
||||||
|
|
||||||
|
In the above example, the definition of `View` is equivalent to:
|
||||||
|
|
||||||
|
struct View
|
||||||
|
{
|
||||||
|
0: int16 x;
|
||||||
|
2: list<bool> z;
|
||||||
|
}
|
||||||
|
|
||||||
|
A view of a generic struct is also a generic struct with the same number of
|
||||||
|
type parameters.
|
||||||
|
|
||||||
|
A view of a sealed struct is always sealed. A view of non-sealed struct can be
|
||||||
|
defined to be sealed:
|
||||||
|
|
||||||
|
sealed struct View view_of Example
|
||||||
|
{
|
||||||
|
x,
|
||||||
|
z;
|
||||||
|
}
|
||||||
|
|
||||||
|
See example: `examples/cpp/core/schema_view`
|
||||||
|
|
||||||
|
|
||||||
|
Custom attributes
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Struct, enum and field definitions can be annotated with custom attributes
|
||||||
|
which are in effect name, string-values pairs:
|
||||||
|
|
||||||
|
[Validate("True")]
|
||||||
|
struct Example
|
||||||
|
{
|
||||||
|
[Max("100")]
|
||||||
|
0: uint32 value;
|
||||||
|
}
|
||||||
|
|
||||||
|
Attributes are available in code generation templates and thus can be used to
|
||||||
|
drive custom code generation. They are also available to applications via
|
||||||
|
[compile-time](#compile-time-schema) and [runtime](#runtime-schema) schema, and
|
||||||
|
as `Metadata` argument in [transforms](#transforms) and [protocols](#protocols).
|
||||||
|
|
||||||
|
See example: `examples/cpp/core/attributes`
|
||||||
|
|
||||||
|
|
||||||
|
Comments
|
||||||
|
--------
|
||||||
|
|
||||||
|
Bond IDL supports C++ style comments:
|
||||||
|
|
||||||
|
/*
|
||||||
|
Multi-line
|
||||||
|
comment
|
||||||
|
*/
|
||||||
|
struct Example
|
||||||
|
{
|
||||||
|
// One line comment
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Schema AST
|
||||||
|
==========
|
||||||
|
|
||||||
|
The compiler exposes a JSON representation of the schema Abstract Syntax Tree.
|
||||||
|
The AST is intended for tools that need to access to the schema information
|
||||||
|
contained in Bond IDL files with the full fidelity. The compiler can also take
|
||||||
|
the JSON representation of the AST as an input, enabling tools which
|
||||||
|
programmatically construct/modify Bond schemas.
|
||||||
|
|
||||||
|
The top level JSON object represents the parsed Bond IDL file and has the
|
||||||
|
following structure:
|
||||||
|
|
||||||
|
{
|
||||||
|
"imports": [
|
||||||
|
],
|
||||||
|
"namespaces": [
|
||||||
|
],
|
||||||
|
"declarations": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
Import
|
||||||
|
------
|
||||||
|
|
||||||
|
Imports are represented by JSON strings. For example the following IDL:
|
||||||
|
|
||||||
|
import "bond/core/bond.bond"
|
||||||
|
|
||||||
|
is represented in the AST as:
|
||||||
|
|
||||||
|
"bond/core/bond.bond"
|
||||||
|
|
||||||
|
Namespace
|
||||||
|
---------
|
||||||
|
|
||||||
|
Each Bond file should have one namespace declaration, although the AST and IDL
|
||||||
|
syntax have support for legacy schema files with multiple, language-specific
|
||||||
|
namespaces. The namespace declaration is represented by a JSON object:
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
- `name` is [qualified name](#qualified-name) of the namespace.
|
||||||
|
|
||||||
|
Declaration
|
||||||
|
-----------
|
||||||
|
|
||||||
|
A declaration is represented by a JSON object with the following common properties:
|
||||||
|
|
||||||
|
{
|
||||||
|
"tag": "Tag",
|
||||||
|
"declNamespaces": [
|
||||||
|
],
|
||||||
|
"declName": "Name",
|
||||||
|
"declParams": [
|
||||||
|
],
|
||||||
|
"declAttributes": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
- `tag` is a string indicating the type of the declaration. It can have one of
|
||||||
|
the following values: `"Struct"`, `"Enum"`, `"Alias"`, `"Forward"`.
|
||||||
|
- `declNamespaces` is an array of one or more [namespaces](#namespace).
|
||||||
|
- `declName` is a string.
|
||||||
|
- `declParams` is an array of zero or more [type parameters](#type-parameter).
|
||||||
|
The property doesn't apply to [`Enum`](#enum) declarations.
|
||||||
|
- `declAttributes` is an array of zero or more [attributes](#attribute). The
|
||||||
|
property doesn't apply to [`Forward`](#forward-declaration) declarations.
|
||||||
|
|
||||||
|
### Struct
|
||||||
|
|
||||||
|
A JSON object representing a `Struct` declaration has the following properties:
|
||||||
|
|
||||||
|
{
|
||||||
|
"tag": "Struct",
|
||||||
|
"declNamespaces": [
|
||||||
|
],
|
||||||
|
"declName": "Name",
|
||||||
|
"declParams": [
|
||||||
|
],
|
||||||
|
"declAttributes": [
|
||||||
|
],
|
||||||
|
"structBase": null,
|
||||||
|
"structFields": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
- `structBase` is `null` or a [type](#type) representing the struct base. The
|
||||||
|
property is optional and may be omitted.
|
||||||
|
- `structFields` is an array of zero or more [fields](#struct-field).
|
||||||
|
|
||||||
|
### Enum
|
||||||
|
|
||||||
|
A JSON object representing an `Enum` declaration has the following properties:
|
||||||
|
|
||||||
|
{
|
||||||
|
"tag": "Enum",
|
||||||
|
"declNamespaces": [
|
||||||
|
],
|
||||||
|
"declName": "Name",
|
||||||
|
"declAttributes": [
|
||||||
|
],
|
||||||
|
"enumConstants": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
- `enumConstants` is an array of one or more [constants](#constant).
|
||||||
|
|
||||||
|
#### Constant
|
||||||
|
|
||||||
|
An enum constant is represented by the following JSON object:
|
||||||
|
|
||||||
|
{
|
||||||
|
"constantName": "Name",
|
||||||
|
"constantValue": null
|
||||||
|
}
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
- `constantName` is a string.
|
||||||
|
- `constantValue` is an integer or `null` if the value is not explicitly
|
||||||
|
defined. The property is optional and may be omitted.
|
||||||
|
|
||||||
|
### Type alias
|
||||||
|
|
||||||
|
A JSON object representing a type alias declaration has the following properties:
|
||||||
|
|
||||||
|
{
|
||||||
|
"tag": "Alias",
|
||||||
|
"declNamespaces": [
|
||||||
|
],
|
||||||
|
"declName": "Name",
|
||||||
|
"declParams": [
|
||||||
|
],
|
||||||
|
"aliasType": {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
- `aliasType` is the aliased [`type`](#type).
|
||||||
|
|
||||||
|
### Forward declaration
|
||||||
|
|
||||||
|
A JSON object representing a forward declaration has the following properties:
|
||||||
|
|
||||||
|
{
|
||||||
|
"tag": "Forward",
|
||||||
|
"declNamespaces": [
|
||||||
|
],
|
||||||
|
"declName": "Name",
|
||||||
|
"declParams": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
Qualified name
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Qualified names are represented in JSON by an array of strings. For example:
|
||||||
|
|
||||||
|
foo.bar
|
||||||
|
|
||||||
|
is represented by:
|
||||||
|
|
||||||
|
[ "foo",
|
||||||
|
"bar"
|
||||||
|
]
|
||||||
|
|
||||||
|
Type parameter
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Type parameters are represented by JSON objects with the following properties:
|
||||||
|
|
||||||
|
{
|
||||||
|
"paramName": "T",
|
||||||
|
"paramConstraint": null
|
||||||
|
}
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
- `paramName` is a string.
|
||||||
|
- `paramConstraint` is `null` or the string `"value"`. The property is optional
|
||||||
|
and may be omitted.
|
||||||
|
|
||||||
|
Attribute
|
||||||
|
---------
|
||||||
|
|
||||||
|
Attributes are represented by JSON objects with the following properties:
|
||||||
|
|
||||||
|
{
|
||||||
|
"attrName": [
|
||||||
|
],
|
||||||
|
"attrValue": "Value"
|
||||||
|
}
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
- `attrName` is a [qualified name](#qualified-name).
|
||||||
|
- `attrValue` is a string.
|
||||||
|
|
||||||
|
Struct field
|
||||||
|
------------
|
||||||
|
|
||||||
|
A struct field is represented by a JSON object with the following properties:
|
||||||
|
|
||||||
|
{
|
||||||
|
"fieldModifier": "Optional",
|
||||||
|
"fieldDefault": null,
|
||||||
|
"fieldType": {
|
||||||
|
},
|
||||||
|
"fieldName": "name",
|
||||||
|
"fieldAttributes": [
|
||||||
|
],
|
||||||
|
"fieldOrdinal": 0
|
||||||
|
}
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
- `fieldModifier` is one of the following strings: `"Optional"`, `"Required"`,
|
||||||
|
`"RequiredOptional"`.
|
||||||
|
- `fieldDefault` is `null` or a [default value](#field-default-value). The
|
||||||
|
property is optional and may be omitted.
|
||||||
|
- `fieldType` is a [type](#type).
|
||||||
|
- `fieldName` is a string.
|
||||||
|
- `fieldAttributes` is an array of zero or more [attributes](#attribute).
|
||||||
|
- `fieldOrdinal` is an integer.
|
||||||
|
|
||||||
|
### Field default value
|
||||||
|
|
||||||
|
A field default value is represented by a JSON object with the following properties:
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "enum",
|
||||||
|
"value": "Value2"
|
||||||
|
}
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
- `type` is one of the following strings: `"enum"`, `"bool"`, `"integer"`,
|
||||||
|
`"float"`, `"string"`, `"nothing"`.
|
||||||
|
- `value` is a value appropriate for the type. The `value` property is not used
|
||||||
|
when `type` is `"nothing"`.
|
||||||
|
|
||||||
|
Type
|
||||||
|
----
|
||||||
|
|
||||||
|
### Basic types
|
||||||
|
|
||||||
|
Basic types are represented by JSON strings:
|
||||||
|
|
||||||
|
"int8"
|
||||||
|
"int16"
|
||||||
|
"int32"
|
||||||
|
"int64"
|
||||||
|
"uint8"
|
||||||
|
"uint16"
|
||||||
|
"uint32"
|
||||||
|
"uint64"
|
||||||
|
"float"
|
||||||
|
"double"
|
||||||
|
"bool"
|
||||||
|
"string"
|
||||||
|
"wstring"
|
||||||
|
"blob"
|
||||||
|
|
||||||
|
### Complex types
|
||||||
|
|
||||||
|
Complex types are represented by JSON objects with a `type` property indicating
|
||||||
|
the complex type. If the `type` property is one of the following: `"vector"`,
|
||||||
|
`"list"`, `"set"`, `"nullable"`, `"maybe"`, `"bonded"` then the object has the
|
||||||
|
following structure:
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "vector",
|
||||||
|
"element": {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
where `element` is the [type](#type) of the element (or the nested type).
|
||||||
|
|
||||||
|
Other complex types are:
|
||||||
|
|
||||||
|
- map
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
{
|
||||||
|
"type": "map",
|
||||||
|
"key": {
|
||||||
|
},
|
||||||
|
"element": {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
- `key` is the [type](#type) of the map key.
|
||||||
|
- `element` is the [type](#type) of map value.
|
||||||
|
|
||||||
|
- type parameter
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
{
|
||||||
|
"type": "parameter",
|
||||||
|
"value": {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
where `value` is a [type parameter](#type-parameter).
|
||||||
|
|
||||||
|
- numeric type argument
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
{
|
||||||
|
"type": "constant,
|
||||||
|
"value": 0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
where `value` is an integer.
|
||||||
|
|
||||||
|
- user defined type
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
{
|
||||||
|
"type": "user",
|
||||||
|
"declaration": {
|
||||||
|
},
|
||||||
|
"arguments": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
- `declaration` is a [declaration](#declaration) of a user defined type.
|
||||||
|
- `arguments` is an array of zero or more [types](#type) representing type
|
||||||
|
arguments for a generic user defined type. The property is optional and
|
||||||
|
may be omitted for non-generic types.
|
||||||
|
|
|
@ -13,7 +13,7 @@ like to include a link to it in this document, please send a pull request.
|
||||||
Meta schema
|
Meta schema
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
Bond has a very rich [type system](manual/bond_cpp.html#idl-syntax). It is
|
Bond has a very rich [type system](manual/compiler.html#idl-syntax). It is
|
||||||
probably most similar to Thrift in this respect. Some notable additions in Bond
|
probably most similar to Thrift in this respect. Some notable additions in Bond
|
||||||
are inheritance, [type aliases](manual/bond_cpp.html#type-aliases) and
|
are inheritance, [type aliases](manual/bond_cpp.html#type-aliases) and
|
||||||
[generics](manual/bond_cpp.html#generics). One type system feature not present
|
[generics](manual/bond_cpp.html#generics). One type system feature not present
|
||||||
|
|
Загрузка…
Ссылка в новой задаче