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