@asyncapi/protobuf-schema-parser
Version:
An AsyncAPI schema parser for Protocol Buffers data types.
183 lines (139 loc) • 6.93 kB
Markdown
for Protocol Buffers data types.
For ProtoBuff 2 and 3 schemas.
There is no explicit distinction between ProtoBuff 2 and 3. You dont have to expect any errors if your `schemaFormat`
is `application/vnd.google.protobuf;version=2` defined, but your schema is proto3.
Version >= `2.0.0` of package is only supported by `@asyncapi/parser` version >= `2.0.0`.
This package is browser-compatible.
```
npm install @asyncapi/protobuf-schema-parser
// OR
yarn add @asyncapi/protobuf-schema-parser
```
```ts
import {Parser} from '@asyncapi/parser';
import {ProtoSchemaParser} from '@asyncapi/protobuf-schema-parser'
const parser = new Parser();
parser.registerSchemaParser(ProtoSchemaParser());
const asyncapiWithProto = `
asyncapi: 2.0.0
info:
title: Example with ProtoBuff
version: 0.1.0
channels:
example:
publish:
message:
schemaFormat: 'application/vnd.google.protobuf;version=3'
payload: |
message Point {
required int32 x = 1;
required int32 y = 2;
optional string label = 3;
}
message Line {
required Point start = 1;
required Point end = 2;
optional string label = 3;
}
`
const {document} = await parser.parse(asyncapiWithProto);
```
```js
const {Parser} = require('@asyncapi/parser');
const {ProtoSchemaParser} = require('@asyncapi/protobuf-schema-parser');
const parser = new Parser();
parser.registerSchemaParser(ProtoSchemaParser());
const asyncapiWithProto = `
asyncapi: 2.0.0
info:
title: Example with ProtoBuff
version: 0.1.0
channels:
example:
publish:
message:
schemaFormat: 'application/vnd.google.protobuf;version=3'
payload: |
message Point {
required int32 x = 1;
required int32 y = 2;
optional string label = 3;
}
message Line {
required Point start = 1;
required Point end = 2;
optional string label = 3;
}
`
const {document} = await parser.parse(asyncapiWithProto);
```
Place your protoBuff schema as string in `payload` to get it parsed.
References are NOT supported:
- no support for `$ref`
- no support for [`import`](https://protobuf.dev/programming-guides/proto3/#importing-definitions), except the default
google types:
- google/protobuf/*
- google/type/*
## Comments
Each field of a message may have a comment witch will be reflected as json schema `description`.
Furthermore, the comment can contain the following annotations:
```
message Point {
/*
* The cordinate on the x axis.
* @Default 99
* @Min 0
* @Max 100
*/
required int32 x = 1;
/*
* The cordinate on the y axis.
* @Default 12
* @Min 0
* @Max 100
*/
required int32 y = 2;
optional string label = 3;
}
```
| annotation | description |
|----------------------|:-------------------------------------------------------------------------------------------------------------------------------------|
| @Example | json schema examples keyword. Can exists multiple times. If used with an complex type, an single lines json object hast to be used. |
| @Min or @Minimum | json schema [numeric validator](https://json-schema.org/understanding-json-schema/reference/numeric#range) |
| @Max or @Maximum | json schema [numeric validator](https://json-schema.org/understanding-json-schema/reference/numeric#range) |
| @Pattern | json scheme [string validator](https://json-schema.org/understanding-json-schema/reference/string#regexp) |
| @ExclusiveMinimum | json schema [numeric validator](https://json-schema.org/understanding-json-schema/reference/numeric#range) |
| @ExclusiveMaximum | json schema [numeric validator](https://json-schema.org/understanding-json-schema/reference/numeric#range) |
| @MultipleOf | json schema [numeric validator](https://json-schema.org/understanding-json-schema/reference/numeric#multiples) |
| @MinLength | json scheme [string validator](https://json-schema.org/understanding-json-schema/reference/string#length) |
| @MaxLength | json scheme [string validator](https://json-schema.org/understanding-json-schema/reference/string#length) |
| @MinItems | json scheme [array validator](https://json-schema.org/understanding-json-schema/reference/array#length) |
| @MaxItems | json scheme [array validator](https://json-schema.org/understanding-json-schema/reference/array#length) |
| @Default | json schema [default value](https://opis.io/json-schema/1.x/default-value.html) |
| annotation | description |
|------------|:---------------------------------------------------------------------------------------------------------|
| @RootNode | If there are multiple types without an parent you can give a hint to the root node with this annotation. |
| annotation | description |
|------------|:----------------------------------------------------------|
| @Option | In head of your file you can place options for the parser |
The `@Option` have to follow by space separated options key and another space separated value
```
// @Option primitiveTypesWithLimits false
message Point {
}
```
Possible options are:
| option | description | def |
|--------------------------|:-----------------------------------------------------------------------------------------------------------|:-----|
| primitiveTypesWithLimits | If you dont like to get default Min and Max limits for primitive types, you can set this option to `false` | true |
If you would like to add additional validation to your proto files, you can use one of the following validation frameworks.
- [proto-gen-validate](https://github.com/bufbuild/protoc-gen-validate) Validation of lists are not 100% supported
- [protovalid](https://github.com/bufbuild/protovalidate)
A schema parser