Skip to content

Commit 96bdde7

Browse files
authored
Kotlin: Add option to add defaults to nullable fields (#863)
1 parent 69dee51 commit 96bdde7

File tree

15 files changed

+475
-2
lines changed

15 files changed

+475
-2
lines changed

docs/codegen-options.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ See [DirectiveAnnotationsMapping](#option-directiveannotationsmapping)* |
5656
| `responseProjectionMaxDepth` | Integer | 3 | Sets max depth when use `all$()` which for facilitating the construction of projection automatically, the fields on all projections are provided when it be invoked. This is a global configuration, of course, you can use `all$(max)` to set for each method. For self recursive types, too big depth may result in a large number of returned data!|
5757
| `generatedLanguage` | Enum | GeneratedLanguage.JAVA | Choose which language you want to generate, Java,Scala,Kotlin were supported. Note that due to language features, there are slight differences in default values between languages.|
5858
| `generateModelOpenClasses` | Boolean | false | The class type of the generated model. If true, generate normal classes, else generate data classes. It only support in kotlin(```data class```) and scala(```case class```). Maybe we will consider to support Java ```record``` in the future.|
59+
| `initializeNullableTypes` | Boolean | false | Adds a default null value to nullable arguments. Only supported in Kotlin.
5960
| `typesAsInterfaces` | Set(String) | Empty | Types that must generated as interfaces should be defined here in format: `TypeName` or `@directive`. E.g.: `User`, `@asInterface`. |
6061

6162
### Option `graphqlSchemas`

plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode
103103
private List<String> configurationFiles;
104104
private GeneratedLanguage generatedLanguage = MappingConfigConstants.DEFAULT_GENERATED_LANGUAGE;
105105
private Boolean generateModelOpenClasses = MappingConfigConstants.DEFAULT_GENERATE_MODEL_OPEN_CLASSES;
106+
private Boolean initializeNullableTypes = MappingConfigConstants.DEFAULT_INITIALIZE_NULLABLE_TYPES;
106107

107108
public GraphQLCodegenGradleTask() {
108109
setGroup("codegen");
@@ -178,6 +179,7 @@ public void generate() throws Exception {
178179

179180
mappingConfig.setGeneratedLanguage(generatedLanguage);
180181
mappingConfig.setGenerateModelOpenClasses(generateModelOpenClasses);
182+
mappingConfig.setInitializeNullableTypes(initializeNullableTypes);
181183

182184
instantiateCodegen(mappingConfig).generate();
183185
}
@@ -844,4 +846,15 @@ public Boolean isGenerateModelOpenClasses() {
844846
public void setGenerateModelOpenClasses(Boolean generateModelOpenClasses) {
845847
this.generateModelOpenClasses = generateModelOpenClasses;
846848
}
849+
850+
@Input
851+
@Optional
852+
@Override
853+
public Boolean isInitializeNullableTypes() {
854+
return initializeNullableTypes;
855+
}
856+
857+
public void setInitializeNullableTypes(Boolean initializeNullableTypes) {
858+
this.initializeNullableTypes = initializeNullableTypes;
859+
}
847860
}

plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,9 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
209209
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_GENERATE_MODEL_OPEN_CLASSES_STRING)
210210
private boolean generateModelOpenClasses;
211211

212+
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_INITIALIZE_NULLABLE_TYPES_STRING)
213+
private boolean initializeNullableTypes;
214+
212215
@Override
213216
public void execute() throws MojoExecutionException {
214217
addCompileSourceRootIfConfigured();
@@ -267,6 +270,7 @@ public void execute() throws MojoExecutionException {
267270

268271
mappingConfig.setGeneratedLanguage(generatedLanguage);
269272
mappingConfig.setGenerateModelOpenClasses(isGenerateModelOpenClasses());
273+
mappingConfig.setInitializeNullableTypes(isInitializeNullableTypes());
270274

271275
try {
272276
instantiateCodegen(mappingConfig).generate();
@@ -603,6 +607,11 @@ public Boolean isGenerateModelOpenClasses() {
603607
return generateModelOpenClasses;
604608
}
605609

610+
@Override
611+
public Boolean isInitializeNullableTypes() {
612+
return initializeNullableTypes;
613+
}
614+
606615
public ParentInterfacesConfig getParentInterfaces() {
607616
return parentInterfaces;
608617
}

src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLCodegen.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ protected void initDefaultValues(MappingConfig mappingConfig) {
4949
if (mappingConfig.isGenerateModelOpenClasses() == null) {
5050
mappingConfig.setGenerateModelOpenClasses(false);
5151
}
52+
if (mappingConfig.isInitializeNullableTypes() == null) {
53+
mappingConfig.setInitializeNullableTypes(false);
54+
}
5255
if (mappingConfig.getGenerateBuilder() == null) {
5356
// functional expression
5457
mappingConfig.setGenerateBuilder(false);

src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionsToResolverDataModelMapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.Set;
2525
import java.util.stream.Collectors;
2626

27+
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.INITIALIZE_NULLABLE_TYPES;
2728
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.CLASS_NAME;
2829
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ENUM_IMPORT_IT_SELF_IN_SCALA;
2930
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_ANNOTATION;
@@ -162,6 +163,7 @@ private Map<String, Object> mapToResolverModel(MappingContext mappingContext, St
162163
dataModel.put(GENERATED_INFO, mappingContext.getGeneratedInformation());
163164
dataModel.put(ENUM_IMPORT_IT_SELF_IN_SCALA, mappingContext.getEnumImportItSelfInScala());
164165
dataModel.put(GENERATE_MODEL_OPEN_CLASSES, mappingContext.isGenerateModelOpenClasses());
166+
dataModel.put(INITIALIZE_NULLABLE_TYPES, mappingContext.isInitializeNullableTypes());
165167
return dataModel;
166168
}
167169

src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.Map;
99

1010
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ANNOTATIONS;
11+
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.INITIALIZE_NULLABLE_TYPES;
1112
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.BUILDER;
1213
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.CLASS_NAME;
1314
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ENUM_IMPORT_IT_SELF_IN_SCALA;
@@ -67,6 +68,7 @@ public Map<String, Object> map(MappingContext mappingContext, ExtendedInputObjec
6768
dataModel.put(GENERATED_INFO, mappingContext.getGeneratedInformation());
6869
dataModel.put(ENUM_IMPORT_IT_SELF_IN_SCALA, mappingContext.getEnumImportItSelfInScala());
6970
dataModel.put(GENERATE_MODEL_OPEN_CLASSES, mappingContext.isGenerateModelOpenClasses());
71+
dataModel.put(INITIALIZE_NULLABLE_TYPES, mappingContext.isInitializeNullableTypes());
7072
return dataModel;
7173
}
7274

src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.stream.Collectors;
1919

2020
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ANNOTATIONS;
21+
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.INITIALIZE_NULLABLE_TYPES;
2122
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.BUILDER;
2223
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.CLASS_NAME;
2324
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ENUM_IMPORT_IT_SELF_IN_SCALA;
@@ -102,6 +103,7 @@ public Map<String, Object> map(MappingContext mappingContext,
102103
dataModel.put(ENUM_IMPORT_IT_SELF_IN_SCALA, mappingContext.getEnumImportItSelfInScala());
103104
dataModel.put(PARENT_INTERFACE_PROPERTIES, mappingContext.getParentInterfaceProperties());
104105
dataModel.put(GENERATE_MODEL_OPEN_CLASSES, mappingContext.isGenerateModelOpenClasses());
106+
dataModel.put(INITIALIZE_NULLABLE_TYPES, mappingContext.isInitializeNullableTypes());
105107
return dataModel;
106108
}
107109

src/main/java/com/kobylynskyi/graphql/codegen/model/DataModelFields.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public final class DataModelFields {
3636
public static final String PARENT_INTERFACE_PROPERTIES = "parentInterfaceProperties";
3737
public static final String SERIALIZATION_LIBRARY = "serializationLibrary";
3838
public static final String GENERATE_MODEL_OPEN_CLASSES = "generateModelOpenClasses";
39+
public static final String INITIALIZE_NULLABLE_TYPES = "initializeNullableTypes";
3940

4041
private DataModelFields() {
4142
}

src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,4 +446,12 @@ public interface GraphQLCodegenConfiguration {
446446
*/
447447
Boolean isGenerateModelOpenClasses();
448448

449+
/**
450+
* Specifies whether classes should be generated with constructors setting the
451+
* default value for nullable fields to null.
452+
*
453+
* @return <b>true</b> if nullable fields should be defaulted to null.
454+
*/
455+
Boolean isInitializeNullableTypes();
456+
449457
}

src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable<Ma
7878
private Set<String> typesAsInterfaces = new HashSet<>();
7979

8080
private boolean generateModelOpenClasses;
81+
private boolean initializeNullableTypes;
8182

8283
private GeneratedLanguage generatedLanguage;
8384

@@ -185,6 +186,8 @@ public void combine(MappingConfig source) {
185186
generatedLanguage = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGeneratedLanguage);
186187
generateModelOpenClasses = getValueOrDefaultToThis(source,
187188
GraphQLCodegenConfiguration::isGenerateModelOpenClasses);
189+
initializeNullableTypes = getValueOrDefaultToThis(source,
190+
GraphQLCodegenConfiguration::isInitializeNullableTypes);
188191
}
189192

190193
private <T> T getValueOrDefaultToThis(MappingConfig source, Function<MappingConfig, T> getValueFunction) {
@@ -647,7 +650,6 @@ public void setGeneratedLanguage(GeneratedLanguage generatedLanguage) {
647650
this.generatedLanguage = generatedLanguage;
648651
}
649652

650-
651653
public Boolean isGenerateModelOpenClasses() {
652654
return generateModelOpenClasses;
653655
}
@@ -656,4 +658,12 @@ public void setGenerateModelOpenClasses(boolean generateModelOpenClasses) {
656658
this.generateModelOpenClasses = generateModelOpenClasses;
657659
}
658660

661+
public Boolean isInitializeNullableTypes() {
662+
return initializeNullableTypes;
663+
}
664+
665+
public void setInitializeNullableTypes(boolean initializeNullableTypes) {
666+
this.initializeNullableTypes = initializeNullableTypes;
667+
}
668+
659669
}

0 commit comments

Comments
 (0)