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

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

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

import com.squareup.javapoet.FieldSpec;
import net.zerobuilder.compiler.generate.DtoModuleOutput.AbstractModuleOutput;
import net.zerobuilder.compiler.generate.DtoProjectedGoal.ProjectedGoal;
import net.zerobuilder.compiler.generate.DtoProjectedModule.ProjectedModule;
import net.zerobuilder.compiler.generate.DtoSimpleGoal.SimpleGoal;

import java.util.function.Function;

class DtoInputOutput {

  interface InputOutputCases {
    R simple(InputOutput simple);
    R projected(ProjectedInputOutput projected);
  }

  static  Function asFunction(InputOutputCases cases) {
    return inputOutput -> inputOutput.accept(cases);
  }

  static  Function inputOutputCases(
      Function simpleFunction,
      Function projectedFunction) {
    return asFunction(new InputOutputCases() {
      @Override
      public R simple(InputOutput simple) {
        return simpleFunction.apply(simple);
      }
      @Override
      public R projected(ProjectedInputOutput projected) {
        return projectedFunction.apply(projected);
      }
    });
  }

  static abstract class AbstractInputOutput {
    final AbstractModuleOutput output;
    final FieldSpec cacheField() {
      return cacheField.apply(this);
    }

    AbstractInputOutput(AbstractModuleOutput output) {
      this.output = output;
    }

    abstract  R accept(InputOutputCases cases);
  }

  static final class InputOutput extends AbstractInputOutput {
    private final DtoModule.Module module;
    private final SimpleGoal goal;

    InputOutput(DtoModule.Module module, SimpleGoal goal, AbstractModuleOutput output) {
      super(output);
      this.module = module;
      this.goal = goal;
    }

    @Override
     R accept(InputOutputCases cases) {
      return cases.simple(this);
    }
  }

  static final class ProjectedInputOutput extends AbstractInputOutput {
    final ProjectedModule module;
    final ProjectedGoal goal;

    ProjectedInputOutput(ProjectedModule module, ProjectedGoal goal, AbstractModuleOutput output) {
      super(output);
      this.module = module;
      this.goal = goal;
    }

    @Override
     R accept(InputOutputCases cases) {
      return cases.projected(this);
    }
  }

  private static Function cacheField =
      inputOutputCases(
          simple -> simple.module.cacheField(simple.goal),
          projected -> projected.module.cacheField(projected.goal));

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




© 2015 - 2025 Weber Informatics LLC | Privacy Policy