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