export default async function addDescription()

in compiler/src/steps/add-description.ts [28:78]


export default async function addDescription (model: model.Model, jsonSpec: Map<string, JsonSpec>): Promise<model.Model> {
  for (const endpoint of model.endpoints) {
    if (endpoint.request == null) continue
    const requestDefinition = getDefinition(endpoint.request)
    const spec = jsonSpec.get(endpoint.name)
    assert(spec, `Can't find the json spec for ${endpoint.name}`)

    for (const property of requestDefinition.path) {
      const definition = spec.url.paths.find(path => {
        if (path.parts == null) return false
        return path.parts[property.name] != null
      })
      if (definition?.parts != null) {
        const { description } = definition.parts[property.name]
        if (typeof description === 'string') {
          property.description = property.description ?? description
        }
      }
    }

    if (spec.params != null) {
      for (const property of requestDefinition.query) {
        const param = spec.params[property.name]
        if (param != null && typeof param.description === 'string') {
          property.description = property.description ?? param.description
        }
      }
    }

    if (spec.documentation.description != null) {
      requestDefinition.description = requestDefinition.description ?? spec.documentation.description
    }

    // An API endpoint is defined by an endpoint object (paths and http methods) and a request
    // type (parameters and structure).
    endpoint.description = requestDefinition.description ?? spec.documentation.description
  }

  return model

  function getDefinition (request: model.TypeName): model.Request {
    for (const type of model.types) {
      if (type.kind === 'request') {
        if (type.name.name === request.name && type.name.namespace === request.namespace) {
          return type
        }
      }
    }
    throw new Error(`Can't find the request definiton for ${request.namespace}.${request.name}`)
  }
}