Skip to content

Commit

Permalink
Improve allOf builder stages
Browse files Browse the repository at this point in the history
- The user can either use
only members or only DTO's
to populate the allOf part.
Stages for subsequent members
with the same name are omitted.
- The builder supports now
also nested allOf compositions,
i.e. provide member setters
for the nested allOf schemas.

Issue: #227
Issue: #244
  • Loading branch information
muehmar committed Jan 29, 2024
1 parent b41b6d6 commit 27c220b
Show file tree
Hide file tree
Showing 7 changed files with 433 additions and 289 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,15 @@ public static Generator<JavaObjectPojo, PojoSettings> allOfBuilderGenerator(
SafeBuilderVariant builderVariant) {
return Generator.<JavaObjectPojo, PojoSettings>emptyGen()
.appendList(
allOfMemberGenerator(),
allOfStageGenerator(),
pojo ->
BuilderStage.createStages(builderVariant, pojo)
.toPList()
.flatMapOptional(BuilderStage::asAllOfBuilderStage),
newLine());
}

private static Generator<AllOfBuilderStage, PojoSettings> allOfMemberGenerator() {
private static Generator<AllOfBuilderStage, PojoSettings> allOfStageGenerator() {
final PList<Generator<AllOfBuilderStage, PojoSettings>> content =
PList.of(normalSetter(), optionalSetter(), tristateSetter(), dtoSetter());
return SingleBuilderClassGenerator.singleBuilderClassGenerator(
Expand Down Expand Up @@ -77,37 +77,64 @@ private static Generator<AllOfBuilderStage, PojoSettings> tristateSetter() {
}

private static Generator<AllOfBuilderStage, PojoSettings> dtoSetter() {
return MethodGenBuilder.<AllOfBuilderStage, PojoSettings>create()
.modifiers(PUBLIC)
.noGenericTypes()
.returnType(stage -> stage.getNextStage().getName())
.methodName(
(stage, settings) ->
stage
.getAllOfSubPojo()
.prefixedClassNameForMethod(settings.getBuilderMethodPrefix())
.asString())
.singleArgument(
stage ->
new MethodGen.Argument(stage.getAllOfSubPojo().getClassName().asString(), "dto"))
.doesNotThrow()
.content(
(stage, s, w) ->
w.println(
"return new %s(builder.%s(dto));",
stage.getNextStage().getName(),
stage.getAllOfSubPojo().prefixedClassNameForMethod(s.getBuilderMethodPrefix())))
.build()
.filter(stage -> stage.getMemberIndex() == 0);
final MethodGen<AllOfPojoStage, PojoSettings> generator =
MethodGenBuilder.<AllOfPojoStage, PojoSettings>create()
.modifiers(PUBLIC)
.noGenericTypes()
.returnType(stage -> stage.getNextStage().getName())
.methodName(
(stage, settings) ->
stage
.getAllOfBuilderStage()
.getAllOfSubPojo()
.prefixedClassNameForMethod(settings.getBuilderMethodPrefix())
.asString())
.singleArgument(
stage ->
new MethodGen.Argument(
stage.getAllOfBuilderStage().getAllOfSubPojo().getClassName().asString(),
"dto"))
.doesNotThrow()
.content(
(stage, s, w) ->
w.println(
"return new %s(builder.%s(dto));",
stage.getNextStage().getName(),
stage
.getAllOfBuilderStage()
.getAllOfSubPojo()
.prefixedClassNameForMethod(s.getBuilderMethodPrefix())))
.build();
return Generator.<AllOfBuilderStage, PojoSettings>emptyGen()
.appendOptional(generator, AllOfPojoStage::fromAllOfBuilderStage);
}

@Value
private static class AllOfPojoStage {
AllOfBuilderStage allOfBuilderStage;
BuilderStage nextStage;

static Optional<AllOfPojoStage> fromAllOfBuilderStage(AllOfBuilderStage stage) {
return stage
.getSubPojoStageObjects()
.map(
subPojoStageObjects -> new AllOfPojoStage(stage, subPojoStageObjects.getNextStage()));
}
}

@Value
private static class AllOfMember implements SingleMemberSetterGenerator.Member {
AllOfBuilderStage stage;
JavaPojoMember member;
BuilderStage nextStage;

static Optional<AllOfMember> fromStage(AllOfBuilderStage stage) {
return stage.getMember().map(member -> new AllOfMember(stage, member));
return stage
.getMemberStageObjects()
.map(
memberStageObjects ->
new AllOfMember(
stage, memberStageObjects.getMember(), memberStageObjects.getNextStage()));
}

@Override
Expand All @@ -117,7 +144,7 @@ public String stageClassName() {

@Override
public String nextStageClassName() {
return stage.getNextMemberStage().getName();
return nextStage.getName();
}

public boolean isJavaOptional() {
Expand Down
Loading

0 comments on commit 27c220b

Please sign in to comment.