SchemaV3 ::= SchemaOptions? TypeDef* ResourceDef* SchemaOptions ::= NamespaceSpec? NameSpec? VersionSpec? BasePath? IncludeSpec* UseSpec* NamespaceSpec ::= "namespace" Namespace (";")? NameSpec ::= "name" Name (";")? VersionSpec ::= "version" LiteralInteger (";")? BasePath ::= "base" LiteralString (";")? IncludeSpec ::= "include" LiteralString (";")? UseSpec ::= "use" LiteralString (";")? TypeDef ::= "type" Name TypeSpec (";")? TypeSpec ::= TypeRef | AliasTypeSpec | BytesTypeSpec | StringTypeSpec | SymbolTypeSpec | ArrayTypeSpec | MapTypeSpec | StructTypeSpec | UnionTypeSpec | EnumTypeSpec AliasTypeSpec ::= TypeRef ("(" ExtendedOption ("," ExtendedOption)* ")")? BytesTypeSpec ::= "Bytes" ("[" LiteralInteger "]")? ("(" BytesOption ("," BytesOption)* ")")? BytesOption ::= "minsize" "=" LiteralInteger | "maxsize" "=" LiteralInteger | ExtendedOption StringTypeSpec ::= "String" ("(" StringOption ("," StringOption)* ")")? StringOption ::= "pattern" "=" LiteralString | "values" "=" "[" LiteralString ("," LiteralString)* "]" | "minsize" "=" LiteralInteger | "maxsize" "=" LiteralInteger | ExtendedOption SymbolTypeSpec ::= "Symbol" ("(" SymbolOption ("," SymbolOption)* ")")? SymbolOption ::= "values" "=" "[" LiteralSymbol ("," LiteralSymbol)* "]" | ExtendedOption ArrayTypeSpec ::= "Array" "<" TypeRef ">" ("(" ArrayOption ("," ArrayOption)* ")")? ArrayOption ::= "size" "=" LiteralInteger | "minsize" "=" LiteralInteger | "maxsize" "=" LiteralInteger | ExtendedOption MapTypeSpec ::= "Map" "<" TypeRef "," TypeRef ">" ("(" MapOption ("," MapOption)* ")")? MapOption ::= "size" "=" LiteralInteger | "minsize" "=" LiteralInteger | "maxsize" "=" LiteralInteger | ExtendedOption StructTypeSpec ::= "Struct" ("(" StructOption ("," StructOption)* ")")? "{" FieldSpec+ "}" StructOption ::= "closed" | ExtendedOption FieldSpec ::= TypeSpec Name ("(" FieldOption ("," FieldOption)* ")")? ";" FieldOption ::= "optional" | "default" "=" Literal | StringOption | SymbolOption | ArrayOption | MapOption | NumberOption | ExtendedOption NumberTypeSpec ::= NumberType ("(" NumberOption ("," NumberOption)* ")")? NumberOption ::= "min" "=" LiteralNumber | "max" "=" LiteralNumber | ExtendedOption UnionTypeSpec ::= "Union" "<" TypeName ("," TypeName)* ">" ("(" UnionOption ("," UnionOption)* ")")? UnionOption ::= ExtendedOption EnumTypeSpec ::= "Enum" ("(" EnumOption ("," EnumOption)* ")")? "{" Identifier ("," Identifier)* ("}")? EnumOption ::= ExtendedOption ExtendedOption ::= "x_" LiteralSymbol | "x_" LiteralSymbol "=" LiteralString NumericType ::= "Int8" | "Int16" | "Int32" | "Int64" | "Float32" | "Float64" TypeName ::= "Bool" | "Bytes" | "String" | "Symbol" | "UUID" | "Timestamp" | "Array" | "Map" | "Struct" | NumericType | UserTypeName TypeRef ::= TypeName | "Any" UserTypeName ::= Name Identifier ::= Name Name ::= NameStartChar (NameChar)* CompoundName ::= Name ("." Name)* Namespace ::= CompoundName Literal ::= LiteralMap | LiteralArray | LiteralNumber | LiteralString | LiteralSymbol | "true" | "false" LiteralSymbol ::= Name LiteralMap ::= "{" (Name ":" Literal) ("," Name ":" Literal)* "}" LiteralArray ::= "[" Literal ("," Literal)* "}" LiteralString ::= '"' [^"]* '"' LiteralNumber ::= LiteralInteger ("." Digit+)? LiteralInteger ::= ("-")? PositiveDigit (Digit)* PositiveDigit ::= [1-9] Digit ::= [0-9] Alphanumeric ::= [A-Z] | [a-z] | [0-9] NameStartChar ::= [A-Z] | "_" | [a-z] NameChar ::= NameStartChar | [0-9] ResourceDef ::= "resource" TypeName Method LiteralString "{" InputSpec+ OutputSpec+ Authorization ExpectedSpec ExceptionSpec "}" Method ::= "GET" | "PUT" | "DELETE" | "POST" StringTemplate ::= '"' ([^"]* "{" Name "}")* '"' InputSpec ::= TypeSpec Name ("(" InputOption ("," InputOption)* ")")? ";" ParamOption ::= "optional" | "header" "=" ParamName | "context" "=" ("auth.credentials" | "auth.principal") | "default" "=" Literal OutputSpec ::= TypeSpec Name ("(" OutputOption ("," OutputOption)* ")")? ";" OutputOption ::= "header" "=" ParamName | "out" Authorization ::= "authorize" "(" ActionName "," ResourceName ("," DomainName)? ")" ExpectedSpec ::= "expected" Status ("," Status)* ";" ExceptionSpec ::= "exception" "{" (TypeName Status ";")+ "}" Status ::= "OK" | "CREATED" | "NO_CONTENT" | "NOT_MODIFIED" | "NOT_FOUND" | "BAD_REQUEST" | "etc" ParamChar ::= [A-Z] | "-" | [a-z] | [0-9] | "_" ParamName ::= (ParamChar)+