in compiler/src/steps/validate-model.ts [831:888]
function typeDefJsonEvents (events: Set<JsonEvent>, typeDef: model.TypeDefinition): void {
if (typeDef.name.namespace === '_builtins') {
switch (typeDef.name.name) {
case 'string':
validateEvent(events, JsonEvent.string)
return
case 'boolean':
validateEvent(events, JsonEvent.boolean)
return
case 'number':
validateEvent(events, JsonEvent.number)
return
case 'object':
validateEvent(events, JsonEvent.object)
return
case 'null':
validateEvent(events, JsonEvent.null)
return
case 'Array':
validateEvent(events, JsonEvent.array)
return
}
}
switch (typeDef.kind) {
case 'request':
case 'interface':
validateEvent(events, JsonEvent.object)
break
case 'enum':
validateEvent(events, JsonEvent.string)
break
case 'type_alias':
if (typeDef.variants == null) {
valueOfJsonEvents(events, typeDef.type)
} else {
// tagged union: the discriminant tells us what to look for, check each member in isolation
assert(typeDef.type.kind === 'union_of', 'Variants are only allowed on union_of type aliases')
for (const item of flattenUnionMembers(typeDef.type, new Set())) {
validateValueOfJsonEvents(item)
}
// Internally tagged variants will be objects, so check that we can read them
if (typeDef.variants.kind === 'internal_tag') {
// variant items will be objects
validateEvent(events, JsonEvent.object)
}
}
break
}
}