Skip to content

Commit 173f595

Browse files
Support for enum in unions (#152)
* feat: Enums in union implements interface * chore: unused imports
1 parent ecb0339 commit 173f595

File tree

7 files changed

+108
-3
lines changed

7 files changed

+108
-3
lines changed

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,24 @@
33
import com.kobylynskyi.graphql.codegen.model.EnumValueDefinition;
44
import com.kobylynskyi.graphql.codegen.model.MappingContext;
55
import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedEnumTypeDefinition;
6+
import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedUnionTypeDefinition;
67
import graphql.language.Comment;
78
import graphql.language.Directive;
89
import graphql.language.DirectivesContainer;
910

10-
import java.util.*;
11+
import java.util.Collections;
12+
import java.util.HashMap;
13+
import java.util.List;
14+
import java.util.Map;
15+
import java.util.Objects;
16+
import java.util.Set;
1117
import java.util.stream.Collectors;
1218

13-
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.*;
19+
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.CLASS_NAME;
20+
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.FIELDS;
21+
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.IMPLEMENTS;
22+
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.JAVA_DOC;
23+
import static com.kobylynskyi.graphql.codegen.model.DataModelFields.PACKAGE;
1424

1525
/**
1626
* Map enum definition to a Freemarker data model
@@ -31,11 +41,22 @@ public static Map<String, Object> map(MappingContext mappingContext, ExtendedEnu
3141
// type/enum/input/interface/union classes do not require any imports
3242
dataModel.put(PACKAGE, MapperUtils.getModelPackageName(mappingContext));
3343
dataModel.put(CLASS_NAME, MapperUtils.getClassNameWithPrefixAndSuffix(mappingContext, definition));
44+
dataModel.put(IMPLEMENTS, getUnionInterfaces(mappingContext, definition));
3445
dataModel.put(JAVA_DOC, definition.getJavaDoc());
3546
dataModel.put(FIELDS, map(definition.getValueDefinitions()));
3647
return dataModel;
3748
}
3849

50+
private static Set<String> getUnionInterfaces(MappingContext mappingContext,
51+
ExtendedEnumTypeDefinition definition) {
52+
return mappingContext.getDocument().getUnionDefinitions()
53+
.stream()
54+
.filter(union -> union.isDefinitionPartOfUnion(definition))
55+
.map(ExtendedUnionTypeDefinition::getName)
56+
.map(unionName -> MapperUtils.getClassNameWithPrefixAndSuffix(mappingContext, unionName))
57+
.collect(Collectors.toSet());
58+
}
59+
3960
/**
4061
* Mapper from GraphQL's EnumValueDefinition to a Freemarker-understandable format
4162
*

src/main/resources/templates/javaClassGraphqlEnum.ftl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ package ${package};
99
</#list>
1010
*/
1111
</#if>
12-
public enum ${className} {
12+
public enum ${className}<#if implements?has_content> implements <#list implements as interface>${interface}<#if interface_has_next>, </#if></#list></#if> {
1313

1414
<#list fields as field>
1515
<#if field.javaDoc?has_content>
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.kobylynskyi.graphql.codegen;
2+
3+
import com.kobylynskyi.graphql.codegen.model.MappingConfig;
4+
import com.kobylynskyi.graphql.codegen.utils.Utils;
5+
import org.junit.jupiter.api.AfterEach;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
9+
import java.io.File;
10+
import java.util.Arrays;
11+
import java.util.Collections;
12+
import java.util.List;
13+
import java.util.Objects;
14+
15+
import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent;
16+
import static java.util.stream.Collectors.toList;
17+
import static org.junit.jupiter.api.Assertions.assertEquals;
18+
19+
class GraphQLCodegenUnionWithEnumTest {
20+
21+
private final File outputBuildDir = new File("build/generated");
22+
private final File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/enumunion");
23+
24+
private GraphQLCodegen generator;
25+
26+
@BeforeEach
27+
void init() {
28+
MappingConfig mappingConfig = new MappingConfig();
29+
mappingConfig.setPackageName("com.kobylynskyi.graphql.enumunion");
30+
List<String> schemas = Collections.singletonList(
31+
"src/test/resources/schemas/union-with-enum.graphqls"
32+
);
33+
generator = new GraphQLCodegen(schemas, outputBuildDir, mappingConfig);
34+
}
35+
36+
@AfterEach
37+
void cleanup() {
38+
Utils.deleteDir(new File("build/generated"));
39+
}
40+
41+
@Test
42+
void generate_CheckFiles() throws Exception {
43+
generator.generate();
44+
45+
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
46+
List<String> generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList());
47+
assertEquals(Arrays.asList("EnumMember1.java", "EnumMember2.java", "EnumUnion.java"), generatedFileNames);
48+
49+
for (File file : files) {
50+
assertSameTrimmedContent(
51+
new File(String.format("src/test/resources/expected-classes/enum-union/%s.txt", file.getName())),
52+
file);
53+
}
54+
}
55+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.kobylynskyi.graphql.enumunion;
2+
3+
public enum EnumMember1 implements EnumUnion {
4+
5+
VALUE
6+
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.kobylynskyi.graphql.enumunion;
2+
3+
public enum EnumMember2 implements EnumUnion {
4+
5+
OTHER_VALUE
6+
7+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.kobylynskyi.graphql.enumunion;
2+
3+
4+
public interface EnumUnion {
5+
6+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
enum EnumMember1 {
2+
VALUE
3+
}
4+
5+
enum EnumMember2 {
6+
OTHER_VALUE
7+
}
8+
9+
union EnumUnion = EnumMember1 | EnumMember2

0 commit comments

Comments
 (0)