Support unions of classes and maps by making them maps

This commit is contained in:
Mark Probst 2018-02-14 09:21:26 -08:00
Родитель d58ab2c563
Коммит 24c739fbe9
6 изменённых файлов: 79 добавлений и 4 удалений

Просмотреть файл

@ -60,11 +60,15 @@ class UnifyUnionBuilder extends UnionBuilder<TypeBuilder & TypeLookerUp, TypeRef
}
protected makeClass(classes: TypeRef[], maps: TypeRef[]): TypeRef {
if (classes.length > 0 && maps.length > 0) {
return panic("Cannot handle a class type that's also a map");
}
if (maps.length > 0) {
return this.typeBuilder.getMapType(this._unifyTypes(maps, this.typeAttributes), this.forwardingRef);
const propertyTypes = maps.slice();
for (let classRef of classes) {
const c = assertIsClass(classRef.deref()[0]);
c.properties.forEach(cp => {
propertyTypes.push(cp.typeRef);
});
}
return this.typeBuilder.getMapType(this._unifyTypes(propertyTypes, this.typeAttributes), this.forwardingRef);
}
if (classes.length === 1) {
return this.typeBuilder.lookupTypeRef(classes[0]);

Просмотреть файл

@ -0,0 +1,5 @@
{
"union": {
"foo": 3.1415
}
}

Просмотреть файл

@ -0,0 +1,5 @@
{
"union": {
"bar": "abc"
}
}

Просмотреть файл

@ -0,0 +1,6 @@
{
"union": {
"foo": true,
"bar": false
}
}

Просмотреть файл

@ -0,0 +1,10 @@
{
"union": {
"foo": {
"quux": 123
},
"bar": {
"quux": 456
}
}
}

Просмотреть файл

@ -0,0 +1,45 @@
{
"type": "object",
"additionalProperties": false,
"properties": {
"union": {
"anyOf": [
{
"type": "object",
"properties": {
"foo": {
"type": "number"
}
},
"additionalProperties": false
},
{
"type": "object",
"properties": {
"bar": {
"type": "string"
}
},
"additionalProperties": false
},
{
"type": "object",
"additionalProperties": {
"type": "boolean"
}
},
{
"type": "object",
"additionalProperties": {
"type": "object",
"properties": {
"quux": {
"type": "integer"
}
}
}
}
]
}
}
}