1
+ package io.github.optimumcode.json.schema.internal.config
2
+
3
+ import io.github.optimumcode.json.schema.FormatBehavior
4
+ import io.github.optimumcode.json.schema.SchemaOption
5
+ import io.github.optimumcode.json.schema.internal.AssertionFactory
6
+ import io.github.optimumcode.json.schema.internal.KeyWord
7
+ import io.github.optimumcode.json.schema.internal.KeyWord.ANCHOR
8
+ import io.github.optimumcode.json.schema.internal.KeyWord.COMPATIBILITY_DEFINITIONS
9
+ import io.github.optimumcode.json.schema.internal.KeyWord.DEFINITIONS
10
+ import io.github.optimumcode.json.schema.internal.KeyWord.DYNAMIC_ANCHOR
11
+ import io.github.optimumcode.json.schema.internal.KeyWord.ID
12
+ import io.github.optimumcode.json.schema.internal.KeyWordResolver
13
+ import io.github.optimumcode.json.schema.internal.ReferenceFactory
14
+ import io.github.optimumcode.json.schema.internal.ReferenceFactory.RefHolder
15
+ import io.github.optimumcode.json.schema.internal.SchemaLoaderConfig
16
+ import io.github.optimumcode.json.schema.internal.SchemaLoaderContext
17
+ import io.github.optimumcode.json.schema.internal.config.Draft6KeyWordResolver.REF_PROPERTY
18
+ import io.github.optimumcode.json.schema.internal.factories.array.AdditionalItemsAssertionFactory
19
+ import io.github.optimumcode.json.schema.internal.factories.array.ContainsAssertionFactory
20
+ import io.github.optimumcode.json.schema.internal.factories.array.ItemsAssertionFactory
21
+ import io.github.optimumcode.json.schema.internal.factories.array.MaxItemsAssertionFactory
22
+ import io.github.optimumcode.json.schema.internal.factories.array.MinItemsAssertionFactory
23
+ import io.github.optimumcode.json.schema.internal.factories.array.UniqueItemsAssertionFactory
24
+ import io.github.optimumcode.json.schema.internal.factories.condition.AllOfAssertionFactory
25
+ import io.github.optimumcode.json.schema.internal.factories.condition.AnyOfAssertionFactory
26
+ import io.github.optimumcode.json.schema.internal.factories.condition.NotAssertionFactory
27
+ import io.github.optimumcode.json.schema.internal.factories.condition.OneOfAssertionFactory
28
+ import io.github.optimumcode.json.schema.internal.factories.general.ConstAssertionFactory
29
+ import io.github.optimumcode.json.schema.internal.factories.general.EnumAssertionFactory
30
+ import io.github.optimumcode.json.schema.internal.factories.general.FormatAssertionFactory
31
+ import io.github.optimumcode.json.schema.internal.factories.general.TypeAssertionFactory
32
+ import io.github.optimumcode.json.schema.internal.factories.number.ExclusiveMaximumAssertionFactory
33
+ import io.github.optimumcode.json.schema.internal.factories.number.ExclusiveMinimumAssertionFactory
34
+ import io.github.optimumcode.json.schema.internal.factories.number.MaximumAssertionFactory
35
+ import io.github.optimumcode.json.schema.internal.factories.number.MinimumAssertionFactory
36
+ import io.github.optimumcode.json.schema.internal.factories.number.MultipleOfAssertionFactory
37
+ import io.github.optimumcode.json.schema.internal.factories.`object`.AdditionalPropertiesAssertionFactory
38
+ import io.github.optimumcode.json.schema.internal.factories.`object`.DependenciesAssertionFactory
39
+ import io.github.optimumcode.json.schema.internal.factories.`object`.MaxPropertiesAssertionFactory
40
+ import io.github.optimumcode.json.schema.internal.factories.`object`.MinPropertiesAssertionFactory
41
+ import io.github.optimumcode.json.schema.internal.factories.`object`.PatternPropertiesAssertionFactory
42
+ import io.github.optimumcode.json.schema.internal.factories.`object`.PropertiesAssertionFactory
43
+ import io.github.optimumcode.json.schema.internal.factories.`object`.PropertyNamesAssertionFactory
44
+ import io.github.optimumcode.json.schema.internal.factories.`object`.RequiredAssertionFactory
45
+ import io.github.optimumcode.json.schema.internal.factories.string.MaxLengthAssertionFactory
46
+ import io.github.optimumcode.json.schema.internal.factories.string.MinLengthAssertionFactory
47
+ import io.github.optimumcode.json.schema.internal.factories.string.PatternAssertionFactory
48
+ import io.github.optimumcode.json.schema.internal.util.getStringRequired
49
+ import kotlinx.serialization.json.JsonElement
50
+ import kotlinx.serialization.json.JsonObject
51
+
52
+ internal object Draft6SchemaLoaderConfig : SchemaLoaderConfig {
53
+ private val factories: List <AssertionFactory > =
54
+ listOf (
55
+ TypeAssertionFactory ,
56
+ EnumAssertionFactory ,
57
+ ConstAssertionFactory ,
58
+ MultipleOfAssertionFactory ,
59
+ MaximumAssertionFactory ,
60
+ ExclusiveMaximumAssertionFactory ,
61
+ MinimumAssertionFactory ,
62
+ ExclusiveMinimumAssertionFactory ,
63
+ MaxLengthAssertionFactory ,
64
+ MinLengthAssertionFactory ,
65
+ PatternAssertionFactory ,
66
+ ItemsAssertionFactory ,
67
+ AdditionalItemsAssertionFactory ,
68
+ MaxItemsAssertionFactory ,
69
+ MinItemsAssertionFactory ,
70
+ UniqueItemsAssertionFactory ,
71
+ ContainsAssertionFactory ,
72
+ MaxPropertiesAssertionFactory ,
73
+ MinPropertiesAssertionFactory ,
74
+ RequiredAssertionFactory ,
75
+ PropertiesAssertionFactory ,
76
+ PatternPropertiesAssertionFactory ,
77
+ AdditionalPropertiesAssertionFactory ,
78
+ PropertyNamesAssertionFactory ,
79
+ DependenciesAssertionFactory ,
80
+ AllOfAssertionFactory ,
81
+ AnyOfAssertionFactory ,
82
+ OneOfAssertionFactory ,
83
+ NotAssertionFactory ,
84
+ )
85
+
86
+ override val defaultVocabulary: SchemaLoaderConfig .Vocabulary = SchemaLoaderConfig .Vocabulary ()
87
+ override val allFactories: List <AssertionFactory >
88
+ get() = factories
89
+
90
+ override fun createVocabulary (schemaDefinition : JsonElement ): SchemaLoaderConfig .Vocabulary ? = null
91
+
92
+ override fun factories (
93
+ schemaDefinition : JsonElement ,
94
+ vocabulary : SchemaLoaderConfig .Vocabulary ,
95
+ options : SchemaLoaderConfig .Options ,
96
+ ): List <AssertionFactory > =
97
+ factories +
98
+ when (options[SchemaOption .FORMAT_BEHAVIOR_OPTION ]) {
99
+ null , FormatBehavior .ANNOTATION_AND_ASSERTION -> FormatAssertionFactory .AnnotationAndAssertion
100
+ FormatBehavior .ANNOTATION_ONLY -> FormatAssertionFactory .AnnotationOnly
101
+ }
102
+
103
+ override val keywordResolver: KeyWordResolver
104
+ get() = Draft6KeyWordResolver
105
+ override val referenceFactory: ReferenceFactory
106
+ get() = Draft6ReferenceFactory
107
+ }
108
+
109
+ private object Draft6KeyWordResolver : KeyWordResolver {
110
+ private const val DEFINITIONS_PROPERTY : String = " definitions"
111
+ private const val ID_PROPERTY : String = " \$ id"
112
+ const val REF_PROPERTY : String = " \$ ref"
113
+
114
+ override fun resolve (keyword : KeyWord ): String? =
115
+ when (keyword) {
116
+ ID -> ID_PROPERTY
117
+ DEFINITIONS -> DEFINITIONS_PROPERTY
118
+ ANCHOR , COMPATIBILITY_DEFINITIONS , DYNAMIC_ANCHOR -> null
119
+ }
120
+ }
121
+
122
+ private object Draft6ReferenceFactory : ReferenceFactory {
123
+ override fun extractRef (
124
+ schemaDefinition : JsonObject ,
125
+ context : SchemaLoaderContext ,
126
+ ): RefHolder ? =
127
+ if (REF_PROPERTY in schemaDefinition) {
128
+ RefHolder .Simple (REF_PROPERTY , schemaDefinition.getStringRequired(REF_PROPERTY ).let (context::ref))
129
+ } else {
130
+ null
131
+ }
132
+
133
+ override val allowOverriding: Boolean
134
+ get() = false
135
+ override val resolveRefPriorId: Boolean
136
+ get() = false
137
+
138
+ override fun recursiveResolutionEnabled (schemaDefinition : JsonObject ): Boolean = true
139
+ }
0 commit comments