@@ -55,16 +55,22 @@ func (s *Schema) apply(ref *Schema) {
5555 }
5656
5757 if ! s .isSet ("items" ) {
58- s .Items = ref .Items
58+ resolved := cloneSchema (ref .Items )
59+ s .Items = resolved
5960 }
6061 if ! s .isSet ("prefixItems" ) {
61- s .PrefixItems = ref .PrefixItems
62+ for _ , pi := range ref .PrefixItems {
63+ resolved := cloneSchema (pi )
64+ s .PrefixItems = append (s .PrefixItems , resolved )
65+ }
6266 }
6367 if ! s .isSet ("unevaluatedItems" ) {
64- s .UnevaluatedItems = ref .UnevaluatedItems
68+ resolved := cloneSchema (ref .UnevaluatedItems )
69+ s .UnevaluatedItems = resolved
6570 }
6671 if ! s .isSet ("contains" ) {
67- s .Contains = ref .Contains
72+ resolved := cloneSchema (ref .Contains )
73+ s .Contains = resolved
6874 }
6975 if ! s .isSet ("maxContains" ) {
7076 s .MaxContains = ref .MaxContains
@@ -88,11 +94,19 @@ func (s *Schema) apply(ref *Schema) {
8894 s .ShuffleItems = ref .ShuffleItems
8995 }
9096
91- if ! s .isSet ("properties" ) {
92- s .Properties = ref .Properties
97+ if ! s .isSet ("properties" ) && ref .Properties != nil {
98+ s .Properties = & Schemas {}
99+ for it := ref .Properties .Iter (); it .Next (); {
100+ resolved := cloneSchema (it .Value ())
101+ s .Properties .Set (it .Key (), resolved )
102+ }
93103 }
94104 if ! s .isSet ("patternProperties" ) {
95- s .PatternProperties = ref .PatternProperties
105+ s .PatternProperties = map [string ]* Schema {}
106+ for name , pi := range ref .PatternProperties {
107+ resolved := cloneSchema (pi )
108+ s .PatternProperties [name ] = resolved
109+ }
96110 }
97111 if ! s .isSet ("minProperties" ) {
98112 s .MinProperties = ref .MinProperties
@@ -115,10 +129,12 @@ func (s *Schema) apply(ref *Schema) {
115129 fmt .Print ("" )
116130 }
117131 if ! s .isSet ("unevaluatedProperties" ) {
118- s .UnevaluatedProperties = ref .UnevaluatedProperties
132+ resolved := cloneSchema (ref .UnevaluatedProperties )
133+ s .UnevaluatedProperties = resolved
119134 }
120135 if ! s .isSet ("propertyNames" ) {
121- s .PropertyNames = ref .PropertyNames
136+ resolved := cloneSchema (ref .PropertyNames )
137+ s .PropertyNames = resolved
122138 }
123139
124140 if ! s .isSet ("anyOf" ) {
@@ -190,3 +206,11 @@ func (s *Schema) isEmpty() bool {
190206func (s * Schema ) isSet (name string ) bool {
191207 return s .m [name ]
192208}
209+
210+ func cloneSchema (s * Schema ) * Schema {
211+ if s == nil {
212+ return nil
213+ }
214+ c := * s
215+ return & c
216+ }
0 commit comments