All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.zerobuilder.compiler.generate.DtoRegularParameter Maven / Gradle / Ivy

There is a newer version: 1.603
Show newest version
package net.zerobuilder.compiler.generate;

import com.squareup.javapoet.TypeName;
import net.zerobuilder.NullPolicy;
import net.zerobuilder.compiler.generate.DtoParameter.AbstractParameter;
import net.zerobuilder.compiler.generate.DtoParameter.ParameterCases;
import net.zerobuilder.compiler.generate.DtoProjectedParameter.AbstractProjectedParameter;
import net.zerobuilder.compiler.generate.DtoProjectionInfo.ProjectionInfo;

import java.util.Optional;
import java.util.function.Function;

public final class DtoRegularParameter {

  interface RegularParameterCases {
    R simpleParameter(SimpleParameter parameter);
    R projectedParameter(ProjectedParameter parameter);
  }

  static  Function asFunction(RegularParameterCases cases) {
    return parameter -> parameter.acceptRegularParameter(cases);
  }

  static  Function regularParameterCases(
      Function simpleParameter,
      Function projectedParameter) {
    return asFunction(new RegularParameterCases() {
      @Override
      public R simpleParameter(SimpleParameter parameter) {
        return simpleParameter.apply(parameter);
      }
      @Override
      public R projectedParameter(ProjectedParameter parameter) {
        return projectedParameter.apply(parameter);
      }
    });
  }

  private static final Function> projectionInfo =
      regularParameterCases(
          simpleParameter -> Optional.empty(),
          projectedParameter -> Optional.of(projectedParameter.projectionInfo));

  /**
   * Represents one method (or constructor) parameter.
   */
  public static abstract class AbstractRegularParameter extends AbstractParameter {

    /**
     * original parameter name
     */
    public final String name;

    private AbstractRegularParameter(String name, TypeName type, NullPolicy nullPolicy) {
      super(type, nullPolicy);
      this.name = name;
    }

    public final Optional projectionInfo() {
      return projectionInfo.apply(this);
    }

    @Override
    public final String name() {
      return name;
    }

    @Override
    public final  R acceptParameter(ParameterCases cases) {
      return cases.regularParameter(this);
    }

    public abstract  R acceptRegularParameter(RegularParameterCases cases);
  }

  public static final class ProjectedParameter extends AbstractRegularParameter implements AbstractProjectedParameter {

    final ProjectionInfo projectionInfo;

    private ProjectedParameter(String name, TypeName type, NullPolicy nullPolicy, ProjectionInfo projectionInfo) {
      super(name, type, nullPolicy);
      this.projectionInfo = projectionInfo;
    }

    @Override
    public  R acceptRegularParameter(RegularParameterCases cases) {
      return cases.projectedParameter(this);
    }

    @Override
    public  R acceptProjected(DtoProjectedParameter.ProjectedParameterCases cases) {
      return cases.projectedRegular(this);
    }
  }

  public static final class SimpleParameter extends AbstractRegularParameter {
    private SimpleParameter(String name, TypeName type, NullPolicy nullPolicy) {
      super(name, type, nullPolicy);
    }

    @Override
    public  R acceptRegularParameter(RegularParameterCases cases) {
      return cases.simpleParameter(this);
    }
  }

  /**
   * Creates a parameter without projection info.
   *
   * @param name       parameter name
   * @param type       parameter type
   * @param nullPolicy null policy
   * @return a parameter
   */
  public static SimpleParameter create(String name, TypeName type, NullPolicy nullPolicy) {
    return new SimpleParameter(name, type, nullPolicy);
  }

  /**
   * Creates a parameter with projection info.
   *
   * @param name           parameter name
   * @param type           parameter type
   * @param nullPolicy     null policy
   * @param projectionInfo projection info
   * @return a parameter
   */
  public static ProjectedParameter create(String name, TypeName type, NullPolicy nullPolicy, ProjectionInfo projectionInfo) {
    return new ProjectedParameter(name, type, nullPolicy, projectionInfo);
  }

  private DtoRegularParameter() {
    throw new UnsupportedOperationException("no instances");
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy