![JAR search and dependency download from the Maven repository](/logo.png)
net.zerobuilder.compiler.generate.DtoInputOutput Maven / Gradle / Ivy
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