Skip to content

Commit

Permalink
feat: add AVRO schema validation (#347)
Browse files Browse the repository at this point in the history
Co-authored-by: Sergio Moya <[email protected]>
  • Loading branch information
jonaslagoni and smoya authored Mar 15, 2023
1 parent 1f090a6 commit 488cf6b
Show file tree
Hide file tree
Showing 3 changed files with 590 additions and 0 deletions.
317 changes: 317 additions & 0 deletions definitions/3.0.0/avroSchema_v1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,317 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://asyncapi.com/definitions/3.0.0/avroSchema_v1.json",
"definitions": {
"avroSchema": {
"title": "Avro Schema",
"description": "Root Schema",
"oneOf": [
{
"$ref": "#/definitions/types"
}
]
},
"types": {
"title": "Avro Types",
"description": "Allowed Avro types",
"oneOf": [
{
"$ref": "#/definitions/primitiveType"
},
{
"$ref": "#/definitions/primitiveTypeWithMetadata"
},
{
"$ref": "#/definitions/customTypeReference"
},
{
"$ref": "#/definitions/avroRecord"
},
{
"$ref": "#/definitions/avroEnum"
},
{
"$ref": "#/definitions/avroArray"
},
{
"$ref": "#/definitions/avroMap"
},
{
"$ref": "#/definitions/avroFixed"
},
{
"$ref": "#/definitions/avroUnion"
}
]
},
"primitiveType": {
"title": "Primitive Type",
"description": "Basic type primitives.",
"type": "string",
"enum": [
"null",
"boolean",
"int",
"long",
"float",
"double",
"bytes",
"string"
]
},
"primitiveTypeWithMetadata": {
"title": "Primitive Type With Metadata",
"description": "A primitive type with metadata attached.",
"type": "object",
"properties": {
"type": {
"$ref": "#/definitions/primitiveType"
}
},
"required": [
"type"
]
},
"customTypeReference": {
"title": "Custom Type",
"description": "Reference to a ComplexType",
"not": {
"$ref": "#/definitions/primitiveType"
},
"type": "string",
"pattern": "^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)*$"
},
"avroUnion": {
"title": "Union",
"description": "A Union of types",
"type": "array",
"items": {
"$ref": "#/definitions/avroSchema"
},
"minItems": 1
},
"avroField": {
"title": "Field",
"description": "A field within a Record",
"type": "object",
"properties": {
"name": {
"$ref": "#/definitions/name"
},
"type": {
"$ref": "#/definitions/types"
},
"doc": {
"type": "string"
},
"default": true,
"order": {
"enum": [
"ascending",
"descending",
"ignore"
]
},
"aliases": {
"type": "array",
"items": {
"$ref": "#/definitions/name"
}
}
},
"required": [
"name",
"type"
]
},
"avroRecord": {
"title": "Record",
"description": "A Record",
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "record"
},
"name": {
"$ref": "#/definitions/name"
},
"namespace": {
"$ref": "#/definitions/namespace"
},
"doc": {
"type": "string"
},
"aliases": {
"type": "array",
"items": {
"$ref": "#/definitions/name"
}
},
"fields": {
"type": "array",
"items": {
"$ref": "#/definitions/avroField"
}
}
},
"required": [
"type",
"name",
"fields"
]
},
"avroEnum": {
"title": "Enum",
"description": "An enumeration",
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "enum"
},
"name": {
"$ref": "#/definitions/name"
},
"namespace": {
"$ref": "#/definitions/namespace"
},
"doc": {
"type": "string"
},
"aliases": {
"type": "array",
"items": {
"$ref": "#/definitions/name"
}
},
"symbols": {
"type": "array",
"items": {
"$ref": "#/definitions/name"
}
}
},
"required": [
"type",
"name",
"symbols"
]
},
"avroArray": {
"title": "Array",
"description": "An array",
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "array"
},
"name": {
"$ref": "#/definitions/name"
},
"namespace": {
"$ref": "#/definitions/namespace"
},
"doc": {
"type": "string"
},
"aliases": {
"type": "array",
"items": {
"$ref": "#/definitions/name"
}
},
"items": {
"$ref": "#/definitions/types"
}
},
"required": [
"type",
"items"
]
},
"avroMap": {
"title": "Map",
"description": "A map of values",
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "map"
},
"name": {
"$ref": "#/definitions/name"
},
"namespace": {
"$ref": "#/definitions/namespace"
},
"doc": {
"type": "string"
},
"aliases": {
"type": "array",
"items": {
"$ref": "#/definitions/name"
}
},
"values": {
"$ref": "#/definitions/types"
}
},
"required": [
"type",
"values"
]
},
"avroFixed": {
"title": "Fixed",
"description": "A fixed sized array of bytes",
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "fixed"
},
"name": {
"$ref": "#/definitions/name"
},
"namespace": {
"$ref": "#/definitions/namespace"
},
"doc": {
"type": "string"
},
"aliases": {
"type": "array",
"items": {
"$ref": "#/definitions/name"
}
},
"size": {
"type": "number"
}
},
"required": [
"type",
"name",
"size"
]
},
"name": {
"type": "string",
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
},
"namespace": {
"type": "string",
"pattern": "^([A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)*)*$"
}
},
"description": "Json-Schema definition for Avro AVSC files.",
"oneOf": [
{
"$ref": "#/definitions/avroSchema"
}
],
"title": "Avro Schema Definition"
}
23 changes: 23 additions & 0 deletions definitions/3.0.0/messageObject.json
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,29 @@
}
}
}
},
{
"if": {
"required": [
"schemaFormat"
],
"properties": {
"schemaFormat": {
"enum": [
"application/vnd.apache.avro;version=1.9.0",
"application/vnd.apache.avro+json;version=1.9.0",
"application/vnd.apache.avro+yaml;version=1.9.0"
]
}
}
},
"then": {
"properties": {
"payload": {
"$ref": "http://asyncapi.com/definitions/3.0.0/avroSchema_v1.json"
}
}
}
}
],
"$schema": "http://json-schema.org/draft-07/schema#",
Expand Down
Loading

0 comments on commit 488cf6b

Please sign in to comment.