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