Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
166 commits
Select commit Hold shift + click to select a range
a913114
add annotation
hauner Jun 12, 2022
3b2cd9d
better name
hauner Jun 12, 2022
cffc4c3
improve
hauner Jun 12, 2022
5d4b21d
support annotations
hauner Jun 12, 2022
058092a
add unevaluatedProperties
hauner Jun 12, 2022
66fea93
improve $ref steps
hauner Jun 12, 2022
7727830
support annotations
hauner Jun 12, 2022
6b4ba47
validate unevaluatedProperties
hauner Jun 12, 2022
78b13a0
must not stop early
hauner Jun 12, 2022
9152614
support annotations
hauner Jun 12, 2022
8a5826b
allow ref siblings
hauner Jun 12, 2022
71cbfd4
update doc
hauner Jun 12, 2022
25ea315
add keyword
hauner Jun 12, 2022
cd135a9
validate dependentSchemas
hauner Jun 12, 2022
661037c
validate unevaluatedProperties
hauner Jun 12, 2022
1bf5bfa
clean up
hauner Jun 19, 2022
9e77005
split id provider
hauner Jun 20, 2022
518a092
clean up
hauner Jun 20, 2022
6244155
clean up
hauner Jun 20, 2022
8aec3f2
$dynamic/$recursive
hauner Jun 20, 2022
cdda1c8
better tracing
hauner Jun 22, 2022
9d0a574
fix
hauner Jun 22, 2022
48daf46
clean up
hauner Jun 22, 2022
56da0f0
improve tracing
hauner Jun 22, 2022
c253234
make explicit
hauner Jun 22, 2022
57666ae
handle dynamic refs
hauner Jun 22, 2022
291cf91
fix
hauner Jun 22, 2022
fb81d61
improve null step
hauner Jun 22, 2022
7b87a7b
should use in & self annotations
hauner Jun 22, 2022
4a6ba85
better home & simpler
hauner Jun 22, 2022
c3fd368
avoid constant
hauner Jun 24, 2022
1659430
fix ref context
hauner Jun 24, 2022
12d6825
clean up
hauner Jun 24, 2022
b9ca5f9
validate dependentRequired
hauner Jun 24, 2022
5f6c26f
validate minContains/maxContains
hauner Jun 24, 2022
1c9fc1f
validate format/uuid
hauner Jun 25, 2022
b6fe2e8
skip format/duration
hauner Jun 25, 2022
b7dc705
update
hauner Jun 25, 2022
747d117
validate unevaluatedItems
hauner Jun 26, 2022
58280f6
fix/improve unevaluatedProperties
hauner Jun 26, 2022
755a157
update
hauner Jun 26, 2022
c1d2b3d
clean up
hauner Feb 5, 2023
f6f1bec
better name
hauner Mar 4, 2023
b05c892
automatically find with empty fragment
hauner Mar 4, 2023
6dcb9cc
clean up
hauner Mar 4, 2023
496bd86
extract document loader
hauner Mar 4, 2023
85cc7bf
better named variants
hauner Mar 4, 2023
26042e3
more uri support
hauner Mar 4, 2023
e25fe3a
add full scope
hauner Mar 4, 2023
3cac59a
clean up
hauner Mar 4, 2023
376ea3b
nullable
hauner Mar 4, 2023
57b4aa5
adjust to scope object
hauner Mar 4, 2023
3d2309c
improve scope handling
hauner Mar 4, 2023
02bdbc8
full scope object
hauner Mar 4, 2023
22aaca1
use full scope object
hauner Mar 4, 2023
6a94017
use full scope object
hauner Mar 4, 2023
275384b
better naming
hauner Mar 4, 2023
2050f48
add schema resources
hauner Mar 4, 2023
f30afaf
more helper
hauner Mar 4, 2023
0db989e
improve resolver
hauner Mar 4, 2023
85cfc17
more helper
hauner Mar 4, 2023
be0d739
use full scope object
hauner Mar 4, 2023
b2099c6
improve id recognition
hauner Mar 4, 2023
fd0a546
clean up
hauner Mar 5, 2023
66d4c0b
use full scope object
hauner Mar 5, 2023
2e1f1c9
use uri factory method
hauner Mar 5, 2023
8079439
clean up
hauner Mar 5, 2023
3c7e38e
fix deprecated
hauner Mar 5, 2023
b053eb5
use full scope object
hauner Mar 5, 2023
0674d0e
fix deprecated
hauner Mar 5, 2023
aebda75
use full scope object
hauner Mar 5, 2023
3efbc12
use full scope object
hauner Mar 5, 2023
13839b6
fix deprecated
hauner Mar 5, 2023
be5d3ee
fix deprecated
hauner Mar 11, 2023
14d8e54
fix test
hauner Mar 11, 2023
58c88cd
fix nullable
hauner Mar 11, 2023
68e7435
fix nullable
hauner Mar 11, 2023
706a69d
fix nullable
hauner Mar 11, 2023
49e7d04
fix deprecated
hauner Mar 11, 2023
1467d2e
unused
hauner Mar 11, 2023
46d0bb6
fix tests
hauner Mar 11, 2023
5a53b42
nullable
hauner Mar 11, 2023
53fcbb2
nullable
hauner Mar 11, 2023
c93e531
nullable
hauner Mar 11, 2023
ac86a99
nullable
hauner Mar 11, 2023
6a4b287
restore
hauner Mar 11, 2023
0c754f3
nullable
hauner Mar 11, 2023
f496a31
nullable
hauner Mar 11, 2023
496d070
nullable
hauner Mar 11, 2023
d86e1b4
clean up
hauner Mar 11, 2023
cea5513
nullable
hauner Mar 11, 2023
35c606a
use full scope object
hauner Mar 12, 2023
27e43d7
missing
hauner Mar 12, 2023
4fd5b26
nullable
hauner Mar 12, 2023
498f952
better name
hauner Mar 12, 2023
3dbe379
get meta schema
hauner Mar 12, 2023
4f9e0fb
remember $schema ref
hauner Mar 12, 2023
e271c37
clean up
hauner Mar 16, 2023
0fd25fe
new util
hauner Mar 16, 2023
639f82c
rewritten
hauner Mar 16, 2023
a94bbbe
simpler schema setup
hauner Mar 16, 2023
66094bb
basic vocabulary support
hauner Mar 16, 2023
bd2f501
improve schemas layout
hauner Mar 19, 2023
f5909fe
better home of factory methods
hauner Mar 25, 2023
47a2e1f
clean up
hauner Mar 25, 2023
e4e9d36
rewrite resolver
hauner Mar 25, 2023
2c77967
fix name
hauner Mar 25, 2023
0c5372c
clean up
hauner Mar 25, 2023
2a6e8d6
clean up
hauner Mar 25, 2023
aa4555a
delegate
hauner Mar 26, 2023
9a955b1
avoid duplicate walk & scope move
hauner Mar 26, 2023
cba1a4e
clean up
hauner Mar 26, 2023
246e74e
simpler
hauner Mar 26, 2023
731a717
avoid under initialized warning
hauner Mar 26, 2023
057fb86
explicit steps/errors
hauner Mar 26, 2023
4d71c77
clean up nullable
hauner Mar 26, 2023
6f2d6d0
clean up nullable
hauner Mar 26, 2023
ea83566
clean up nullable
hauner Mar 26, 2023
c1f2719
clean up nullable
hauner Mar 26, 2023
e3cc3f9
fix
hauner Mar 26, 2023
711ee50
move tests
hauner Mar 31, 2023
39eed24
clean up
hauner Mar 31, 2023
95f63f9
fix store usage
hauner Mar 31, 2023
94aa192
fix tests
hauner Mar 31, 2023
ffa54d1
updated setup
hauner Mar 31, 2023
fcac62f
add root document
hauner Apr 1, 2023
26b50f5
clean up
hauner Apr 1, 2023
a2bfd6d
clean up
hauner Apr 1, 2023
d0a0a93
improve ref "exit"
hauner Apr 1, 2023
2955409
clean up
hauner Apr 1, 2023
3725a48
fix test
hauner Apr 1, 2023
23edf98
add output types
hauner Apr 1, 2023
e17cf68
missing test document
hauner Apr 1, 2023
cf04ba8
missing test documents
hauner Apr 1, 2023
dfe4d67
x.0 numbers are integers
hauner Apr 1, 2023
ab2e165
fix git error
hauner Apr 1, 2023
f0bc715
unused
hauner Apr 2, 2023
5368e55
simpler
hauner Apr 2, 2023
d5b7c43
unused
hauner Apr 2, 2023
8b1e049
basic urn support
hauner Apr 2, 2023
974fe92
new remote files
hauner Apr 2, 2023
1cdd1fe
update remote files
hauner Apr 2, 2023
b0527ef
switch drafts
hauner Apr 2, 2023
0a95c97
update remote files
hauner Apr 2, 2023
27e5ce5
exclude test
hauner Apr 2, 2023
db4ca61
add $schema check to detect version
hauner Apr 2, 2023
65cd8e1
check keyword is in version
hauner Apr 2, 2023
4e099c1
update official test suite
hauner Apr 2, 2023
4d7318f
invalid property error
hauner Apr 3, 2023
c6c3325
init draft4 vocabulary
hauner Apr 3, 2023
5458666
clean up deprecated
hauner Apr 4, 2023
aecfe22
copy object tree
hauner Apr 4, 2023
9d5997e
copy documents
hauner Apr 4, 2023
2378e1c
bundle openapi
hauner Apr 6, 2023
da93e19
update gradle
hauner Apr 6, 2023
6c036ca
update dependencies
hauner Apr 6, 2023
540a072
clean up
hauner Apr 6, 2023
90a8b4c
nullable
hauner Apr 6, 2023
a176bf8
upgrade gradle
hauner Apr 6, 2023
7b6c995
todo nullable
hauner Apr 6, 2023
36dd0b2
does not work anymore?
hauner Apr 6, 2023
dd913c7
clean up
hauner Apr 6, 2023
336141e
nullable
hauner Apr 6, 2023
a5a7330
missing files
hauner Apr 6, 2023
8121329
update dependencies
hauner Apr 6, 2023
0ec5470
update workflows
hauner Apr 6, 2023
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
init draft4 vocabulary
  • Loading branch information
hauner committed Apr 3, 2023
commit c6c33250d51a72276914bab61f37dc53443073a8
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,68 @@

package io.openapiparser.schema;

// TODO move to Vocabulary Objects...
public interface Keywords {
String DEPENDENT_REQUIRED = "dependentRequired";
String DYNAMIC_REF = "$dynamicRef";
// misc
String HASH = "#";

// core
String ID = "$id";
String ID4 = "id";
String SCHEMA = "$schema";

String REF = "$ref";
String DYNAMIC_REF = "$dynamicRef";
String RECURSIVE_ANCHOR = "$recursiveAnchor";
String RECURSIVE_REF = "$recursiveRef";
String REF = "$ref";
String SCHEMA = "$schema";
String VOCABULARY = "$vocabulary";

// applicators
String ALL_OF = "allOf";
String ANY_OF = "anyOf";
String ONE_OF = "oneOf";
String NOT = "not";

// meta data
String TITLE = "title";
String DEFAULT = "default";
String DESCRIPTION = "description";

// format
String FORMAT = "format";

// validation: number
String MULTIPLE_OF = "multipleOf";
String MAXIMUM = "maximum";
String MINIMUM = "minimum";
String EXCLUSIVE_MAXIMUM = "exclusiveMaximum";
String EXCLUSIVE_MINIMUM = "exclusiveMinimum";

// validation: strings
String MAX_LENGTH = "maxLength";
String MIN_LENGTH = "minLength";
String PATTERN = "pattern";

// validation: arrays
String ADDITIONAL_ITEMS = "additionalItems";
String ITEMS = "items";
String MAX_ITEMS = "maxItems";
String MIN_ITEMS = "minItems";
String UNIQUE_ITEMS = "uniqueItems";

// validation: objects
String ADDITIONAL_PROPERTIES = "additionalProperties";
String DEPENDENCIES = "dependencies";
String MAX_PROPERTIES = "maxProperties";
String MIN_PROPERTIES = "minProperties";
String PATTERN_PROPERTIES = "patternProperties";
String PROPERTIES = "properties";
String REQUIRED = "required";

// validation: any
String DEFINITIONS = "definitions";
String ENUM = "enum";
String TYPE = "type";

// todo
String DEPENDENT_REQUIRED = "dependentRequired";
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,16 @@

import java.util.*;

import static io.openapiparser.schema.KeywordType.*;
import static io.openapiparser.schema.Keywords.DEPENDENT_REQUIRED;
import static io.openapiparser.schema.Keywords.*;

// VocabularyFactory
public class SchemaKeywords {
public static final SchemaKeywords draft201909 = new SchemaKeywords (initDraft201909 ());
public static final SchemaKeywords draft7 = new SchemaKeywords (initDraft7 ());
public static final SchemaKeywords draft6 = new SchemaKeywords (initDraft6 ());
public static final SchemaKeywords draft4 = new SchemaKeywords (initDraft4 ());
public static final SchemaKeywords draft4 = new SchemaKeywords (initDraft4Old ());

public static final Vocabulary draft4V = new Vocabulary(initDraft4 ());

private final Map<String, Keyword> keywords;

Expand Down Expand Up @@ -44,11 +46,11 @@ private static Map<String, Keyword> initDraft201909 () {
Map<String, Keyword> keywords = new HashMap<> (initDraft7 ());

// core
keywords.put ("$anchor", keyword (STRING));
keywords.put ("$defs", keyword (SCHEMA_MAP));
keywords.put ("$anchor", keyword (KeywordType.STRING));
keywords.put ("$defs", keyword (KeywordType.SCHEMA_MAP));

keywords.put ("dependentSchemas", keyword(SCHEMA_MAP));
keywords.put(DEPENDENT_REQUIRED, keyword(OBJECT));
keywords.put ("dependentSchemas", keyword(KeywordType.SCHEMA_MAP));
keywords.put(DEPENDENT_REQUIRED, keyword(KeywordType.OBJECT));

return Collections.unmodifiableMap (keywords);
}
Expand All @@ -57,20 +59,20 @@ private static Map<String, Keyword> initDraft7 () {
Map<String, Keyword> keywords = new HashMap<> (initDraft6 ());

// core
keywords.put ("$comment", keyword (STRING));
keywords.put ("$comment", keyword (KeywordType.STRING));

// validation: sub schemas
keywords.put ("if", keyword (SCHEMA));
keywords.put ("then", keyword (SCHEMA));
keywords.put ("else", keyword (SCHEMA));
keywords.put ("if", keyword (KeywordType.SCHEMA));
keywords.put ("then", keyword (KeywordType.SCHEMA));
keywords.put ("else", keyword (KeywordType.SCHEMA));

// validation: annotations
keywords.put ("readOnly", keyword (BOOLEAN));
keywords.put ("writeOnly", keyword (BOOLEAN));
keywords.put ("readOnly", keyword (KeywordType.BOOLEAN));
keywords.put ("writeOnly", keyword (KeywordType.BOOLEAN));

// validation: non json data
keywords.put ("contentMediaType", keyword (STRING));
keywords.put ("contentEncoding", keyword (STRING));
keywords.put ("contentMediaType", keyword (KeywordType.STRING));
keywords.put ("contentEncoding", keyword (KeywordType.STRING));

return Collections.unmodifiableMap (keywords);
}
Expand All @@ -79,24 +81,24 @@ private static Map<String, Keyword> initDraft6 () {
Map<String, Keyword> keywords = new HashMap<> (initDraft4 ());

// core
keywords.put ("$id", keyword (URI));
keywords.put ("$id", keyword (KeywordType.URI));
// delete id

// validation: numbers
keywords.put ("exclusiveMaximum", keyword(NUMBER));
keywords.put ("exclusiveMinimum", keyword(NUMBER));
keywords.put ("exclusiveMaximum", keyword(KeywordType.NUMBER));
keywords.put ("exclusiveMinimum", keyword(KeywordType.NUMBER));

// validation: arrays
keywords.put ("contains", keyword (SCHEMA));
keywords.put ("contains", keyword (KeywordType.SCHEMA));

// validation: objects
keywords.put ("propertyNames", keyword (SCHEMA));
keywords.put ("propertyNames", keyword (KeywordType.SCHEMA));

// validation: any
keywords.put ("const", keyword (ANY));
keywords.put ("const", keyword (KeywordType.ANY));

// validation: meta data
keywords.put ("examples", keyword (ARRAY));
keywords.put ("examples", keyword (KeywordType.ARRAY));

return Collections.unmodifiableMap (keywords);
}
Expand All @@ -105,58 +107,125 @@ private static Map<String, Keyword> initDraft4 () {
Map<String, Keyword> keywords = new HashMap<> ();

// core
keywords.put ("$ref", keyword (URI_REF));
keywords.put ("$schema", keyword (URI));
keywords.put ("id", keyword (URI));
keywords.put (ID4, keyword (KeywordType.URI));
keywords.put (REF, keyword (KeywordType.URI_REF));
keywords.put (SCHEMA, keyword (KeywordType.URI));

// applicators
keywords.put (ALL_OF, keyword (KeywordType.SCHEMA_ARRAY));
keywords.put (ANY_OF, keyword (KeywordType.SCHEMA_ARRAY));
keywords.put (ONE_OF, keyword (KeywordType.SCHEMA_ARRAY));
keywords.put (NOT, keyword (KeywordType.SCHEMA));

// meta
keywords.put (TITLE, keyword (KeywordType.STRING));
keywords.put (DESCRIPTION, keyword (KeywordType.STRING));
keywords.put (DEFAULT, keyword (KeywordType.ANY));

// format
keywords.put (FORMAT, keyword (KeywordType.STRING));

// validation: numbers
keywords.put (EXCLUSIVE_MAXIMUM, keyword (KeywordType.BOOLEAN));
keywords.put (EXCLUSIVE_MINIMUM, keyword (KeywordType.BOOLEAN));
keywords.put (MAXIMUM, keyword (KeywordType.INTEGER));
keywords.put (MINIMUM, keyword (KeywordType.INTEGER));
keywords.put (MULTIPLE_OF, keyword (KeywordType.INTEGER));

// validation: strings
keywords.put (MAX_LENGTH, keyword (KeywordType.NUMBER));
keywords.put (MIN_LENGTH, keyword (KeywordType.NUMBER));
keywords.put (PATTERN, keyword (KeywordType.STRING));

// validation: arrays
keywords.put (ADDITIONAL_ITEMS, keyword (KeywordType.SCHEMA, KeywordType.BOOLEAN));
keywords.put (ITEMS, keyword (KeywordType.SCHEMA, KeywordType.SCHEMA_ARRAY));
keywords.put (MAX_ITEMS, keyword (KeywordType.NUMBER));
keywords.put (MIN_ITEMS, keyword (KeywordType.NUMBER));
keywords.put (UNIQUE_ITEMS, keyword (KeywordType.BOOLEAN));

// validation: objects
keywords.put (ADDITIONAL_PROPERTIES, keyword (KeywordType.SCHEMA));
keywords.put (DEPENDENCIES, keyword (KeywordType.SCHEMA, KeywordType.ARRAY));
keywords.put (MAX_PROPERTIES, keyword (KeywordType.NUMBER));
keywords.put (MIN_PROPERTIES, keyword (KeywordType.NUMBER));
keywords.put (PATTERN_PROPERTIES, keyword (KeywordType.SCHEMA_MAP));
keywords.put (PROPERTIES, keyword (KeywordType.SCHEMA_MAP));
keywords.put (REQUIRED, keyword (KeywordType.ARRAY));

// validation: any
keywords.put (ENUM, keyword (KeywordType.ARRAY));
keywords.put (TYPE, keyword (KeywordType.STRING, KeywordType.ARRAY));
keywords.put (DEFINITIONS, keyword (KeywordType.SCHEMA_MAP));

return Collections.unmodifiableMap (keywords);
}

private static Map<String, Keyword> initDraft4Old () {
Map<String, Keyword> keywords = new HashMap<> ();

// core
keywords.put ("$ref", keyword (KeywordType.URI_REF));
keywords.put ("$schema", keyword (KeywordType.URI));
keywords.put ("id", keyword (KeywordType.URI));

// validation: numbers
keywords.put ("multipleOf", keyword(NUMBER));
keywords.put ("maximum", keyword(NUMBER));
keywords.put ("minimum", keyword (NUMBER));
keywords.put ("exclusiveMaximum", keyword(BOOLEAN));
keywords.put ("exclusiveMinimum", keyword(BOOLEAN));
keywords.put ("multipleOf", keyword(KeywordType.NUMBER));
keywords.put ("maximum", keyword(KeywordType.NUMBER));
keywords.put ("minimum", keyword (KeywordType.NUMBER));
keywords.put ("exclusiveMaximum", keyword(KeywordType.BOOLEAN));
keywords.put ("exclusiveMinimum", keyword(KeywordType.BOOLEAN));

// validation: strings
keywords.put ("maxLength", keyword (INTEGER));
keywords.put ("minLength", keyword (INTEGER));
keywords.put ("pattern", keyword (STRING));
keywords.put ("maxLength", keyword (KeywordType.INTEGER));
keywords.put ("minLength", keyword (KeywordType.INTEGER));
keywords.put ("pattern", keyword (KeywordType.STRING));

// validation: arrays
keywords.put ("additionalItems", keyword (SCHEMA));
keywords.put ("items", keyword (SCHEMA, SCHEMA_ARRAY));
keywords.put ("maxItems", keyword (INTEGER));
keywords.put ("minItems", keyword (INTEGER));
keywords.put ("uniqueItems", keyword (BOOLEAN));
keywords.put ("additionalItems", keyword (KeywordType.SCHEMA));
keywords.put ("items", keyword (KeywordType.SCHEMA, KeywordType.SCHEMA_ARRAY));
keywords.put ("maxItems", keyword (KeywordType.INTEGER));
keywords.put ("minItems", keyword (KeywordType.INTEGER));
keywords.put ("uniqueItems", keyword (KeywordType.BOOLEAN));

// validation: objects
keywords.put ("maxProperties", keyword (INTEGER));
keywords.put ("minProperties", keyword (INTEGER));
keywords.put ("required", keyword (ARRAY));
keywords.put ("additionalProperties", keyword (SCHEMA));
keywords.put ("properties", keyword (SCHEMA_MAP));
keywords.put ("patternProperties", keyword (SCHEMA_MAP));
keywords.put ("dependencies", keyword (SCHEMA, ARRAY));
keywords.put ("maxProperties", keyword (KeywordType.INTEGER));
keywords.put ("minProperties", keyword (KeywordType.INTEGER));
keywords.put ("required", keyword (KeywordType.ARRAY));
keywords.put ("additionalProperties", keyword (KeywordType.SCHEMA));
keywords.put ("properties", keyword (KeywordType.SCHEMA_MAP));
keywords.put ("patternProperties", keyword (KeywordType.SCHEMA_MAP));
keywords.put ("dependencies", keyword (KeywordType.SCHEMA, KeywordType.ARRAY));

// validation: any
keywords.put ("enum", keyword (ARRAY));
keywords.put ("type", keyword (STRING, ARRAY));
keywords.put ("allOf", keyword (SCHEMA_ARRAY));
keywords.put ("anyOf", keyword (SCHEMA_ARRAY));
keywords.put ("oneOf", keyword (SCHEMA_ARRAY));
keywords.put ("not", keyword (SCHEMA));
keywords.put ("definitions", keyword (SCHEMA_MAP));
keywords.put ("enum", keyword (KeywordType.ARRAY));
keywords.put ("type", keyword (KeywordType.STRING, KeywordType.ARRAY));
keywords.put ("allOf", keyword (KeywordType.SCHEMA_ARRAY));
keywords.put ("anyOf", keyword (KeywordType.SCHEMA_ARRAY));
keywords.put ("oneOf", keyword (KeywordType.SCHEMA_ARRAY));
keywords.put ("not", keyword (KeywordType.SCHEMA));
keywords.put ("definitions", keyword (KeywordType.SCHEMA_MAP));

// validation: meta data
keywords.put ("title", keyword (STRING));
keywords.put ("description", keyword (STRING));
keywords.put ("default", keyword (ANY));
keywords.put ("title", keyword (KeywordType.STRING));
keywords.put ("description", keyword (KeywordType.STRING));
keywords.put ("default", keyword (KeywordType.ANY));

// validation: format
keywords.put ("format", keyword (STRING));
keywords.put ("format", keyword (KeywordType.STRING));

return Collections.unmodifiableMap (keywords);
}


private static Keyword stringOrArray () {
return keyword (KeywordType.STRING, KeywordType.ARRAY);
}

private static Keyword schemaArray () {
return keyword (KeywordType.SCHEMA_ARRAY);
}

private static Keyword keyword (KeywordType value, KeywordType... values) {
return new Keyword (EnumSet.of (value, values));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Copyright 2023 https://github.com/openapi-processor/openapi-parser
* PDX-License-Identifier: Apache-2.0
*/

package io.openapiparser.schema;

import org.checkerframework.checker.nullness.qual.Nullable;

import java.util.Map;

public class Vocabulary {
private final Map<String, Keyword> keywords;

public Vocabulary(Map<String, Keyword> keywords) {
this.keywords = keywords;
}

public boolean isKeyword (String candidate) {
return keywords.containsKey (candidate);
}

public @Nullable Keyword getKeyword (String keyword) {
return keywords.get (keyword);
}

public boolean isNavigable (String keyword) {
Keyword match = keywords.get (keyword);
if (match == null)
return false;

return match.isNavigable ();
}
}