001package io.avaje.http.generator.core.openapi;
002
003import io.avaje.http.generator.core.ElementReader;
004import io.avaje.http.generator.core.ParamType;
005import io.avaje.http.generator.core.javadoc.Javadoc;
006import io.swagger.v3.oas.models.Operation;
007import io.swagger.v3.oas.models.media.Schema;
008import io.swagger.v3.oas.models.parameters.Parameter;
009
010import javax.lang.model.element.Element;
011
012/**
013 * Build the OpenAPI for a method parameter.
014 */
015public class MethodParamDocBuilder {
016
017  private final DocContext ctx;
018  private final Javadoc javadoc;
019  private final Operation operation;
020  private final String paramName;
021  private final String varName;
022  private final String rawType;
023  private final ParamType paramType;
024  private final Element element;
025
026  public MethodParamDocBuilder(MethodDocBuilder methodDoc, ElementReader param) {
027
028    this.ctx = methodDoc.getContext();
029    this.javadoc = methodDoc.getJavadoc();
030    this.operation = methodDoc.getOperation();
031
032    this.paramType = param.getParamType();
033    this.paramName = param.getParamName();
034    this.varName = param.getVarName();
035    this.rawType = param.getRawType();
036    this.element = param.getElement();
037  }
038
039  /**
040   * Build the OpenAPI documentation for the method parameter.
041   */
042  public void build() {
043
044    if (paramType == ParamType.FORM || paramType == ParamType.BODY) {
045      addMetaRequestBody(ctx, javadoc, operation);
046
047    } else {
048      Parameter param = new Parameter();
049      param.setName(varName);
050      param.setDescription(javadoc.getParams().get(paramName));
051
052      Schema schema = ctx.toSchema(rawType, element);
053      if (paramType == ParamType.FORMPARAM) {
054        ctx.addFormParam(operation, varName, schema);
055
056      } else {
057        param.setSchema(schema);
058        param.setIn(paramType.getType());
059        operation.addParametersItem(param);
060      }
061    }
062  }
063
064  private void addMetaRequestBody(DocContext ctx, Javadoc javadoc, Operation operation) {
065
066    Schema schema = ctx.toSchema(rawType, element);
067    String description = javadoc.getParams().get(paramName);
068
069    boolean asForm = (paramType == ParamType.FORM);
070    ctx.addRequestBody(operation, schema, asForm, description);
071  }
072
073}