@@ -222,23 +222,45 @@ namespace refract
222222 }
223223 }
224224
225+ ObjectElement* JSONSchemaVisitor::definitionFromVariableProperty (JSONSchemaVisitor& renderer)
226+ {
227+ ObjectElement* definition = new ObjectElement ();
228+
229+ definition->push_back (new MemberElement (
230+ " type" ,
231+ new StringElement (" object" , IElement::rCompact),
232+ IElement::rCompact));
233+ definition->push_back (new MemberElement (
234+ " patternProperties" ,
235+ new ObjectElement (
236+ new MemberElement (" " , renderer.getOwnership (), IElement::rCompact),
237+ IElement::rCompact),
238+ IElement::rCompact));
239+
240+ return definition;
241+ }
242+
225243 ArrayElement* JSONSchemaVisitor::arrayFromProps (std::vector<MemberElement*>& props)
226244 {
227245 ArrayElement *a = new ArrayElement;
228246 a->renderType (IElement::rCompact);
229- for (std::vector<MemberElement *>::const_iterator i = props.begin ();
230- i != props.end ();
231- ++i) {
247+
248+ for (std::vector<MemberElement *>::const_iterator i = props.begin ();
249+ i != props.end ();
250+ ++i) {
232251
233252 StringElement *str = TypeQueryVisitor::as<StringElement>((*i)->value .first );
253+
234254 if (str) {
235255 bool fixedType = IsTypeAttribute (*(*i), " fixedType" );
236256 JSONSchemaVisitor renderer (pDefs, fixed, fixedType);
237257 Visit (renderer, *(*i)->value .second );
258+
238259 pDefs->push_back (new MemberElement (
239- str->value ,
240- renderer.getOwnership (),
241- IElement::rCompact));
260+ str->value ,
261+ definitionFromVariableProperty (renderer),
262+ IElement::rCompact));
263+
242264 a->push_back (new ObjectElement (
243265 new MemberElement (
244266 " $ref" ,
@@ -258,20 +280,23 @@ namespace refract
258280 {
259281 if (o->empty () && props.size () == 1 ) {
260282 StringElement *str = TypeQueryVisitor::as<StringElement>(props[0 ]->value .first );
283+
261284 if (str) {
262285 bool fixedType = IsTypeAttribute (*props.front (), " fixedType" );
263286 JSONSchemaVisitor renderer (pDefs, fixed, fixedType);
264287 Visit (renderer, *props.front ()->value .second );
288+
265289 pDefs->push_back (new MemberElement (
266- str->value ,
267- renderer. getOwnership ( ),
268- IElement::rCompact));
269- addMember ( " $ref " , new StringElement ( " #/definitions/ " + str-> value ,
270- IElement::rCompact));
290+ str->value ,
291+ definitionFromVariableProperty (renderer ),
292+ IElement::rCompact));
293+
294+ addMember ( " $ref " , new StringElement ( " #/definitions/ " + str-> value , IElement::rCompact));
271295 }
272296 }
273297 else {
274298 ArrayElement *a = arrayFromProps (props);
299+
275300 if (!o->empty ()) {
276301 a->push_back (new ObjectElement (
277302 new MemberElement (
@@ -280,6 +305,7 @@ namespace refract
280305 IElement::rCompact),
281306 IElement::rCompact));
282307 }
308+
283309 addMember (" allOf" , a);
284310 }
285311 }
@@ -364,9 +390,7 @@ namespace refract
364390
365391 default :
366392 throw LogicError (" Invalid member type of object in MSON definition" );
367-
368393 }
369-
370394 }
371395
372396 if (!varProps.empty ()) {
0 commit comments