A schema parser 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
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);
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
, except the default google types:- google/protobuf/*
- google/type/*
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 |
@Max or @Maximum | json schema numeric validator |
@Pattern | json scheme string validator |
@ExclusiveMinimum | json schema numeric validator |
@ExclusiveMaximum | json schema numeric validator |
@MultipleOf | json schema numeric validator |
@MinLength | json scheme string validator |
@MaxLength | json scheme string validator |
@MinItems | json scheme array validator |
@MaxItems | json scheme array validator |
@Default | json schema default value |
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 |