function typeDefJsonEvents()

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
    }
  }