Skip to content

Commit d44a704

Browse files
Merge #194, refactored into ClassEnumExtension
2 parents 5974466 + 39fd8bd commit d44a704

File tree

4 files changed

+122
-2
lines changed

4 files changed

+122
-2
lines changed

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/emitter/TsModel.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ public TsModel withBeans(List<TsBeanModel> beans) {
4848
return new TsModel(beans, enums, originalStringEnums, typeAliases, helpers);
4949
}
5050

51+
public TsModel withoutBeans(List<TsBeanModel> beans) {
52+
return new TsModel(Utils.removeAll(this.beans, beans), enums, originalStringEnums, typeAliases, helpers);
53+
}
54+
5155
public List<TsEnumModel> getEnums() {
5256
return enums;
5357
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
2+
package cz.habarta.typescript.generator.ext;
3+
4+
import cz.habarta.typescript.generator.Extension;
5+
import cz.habarta.typescript.generator.compiler.EnumKind;
6+
import cz.habarta.typescript.generator.compiler.EnumMemberModel;
7+
import cz.habarta.typescript.generator.compiler.ModelCompiler;
8+
import cz.habarta.typescript.generator.compiler.ModelTransformer;
9+
import cz.habarta.typescript.generator.compiler.SymbolTable;
10+
import cz.habarta.typescript.generator.emitter.EmitterExtensionFeatures;
11+
import cz.habarta.typescript.generator.emitter.TsBeanModel;
12+
import cz.habarta.typescript.generator.emitter.TsEnumModel;
13+
import cz.habarta.typescript.generator.emitter.TsModel;
14+
import java.lang.reflect.Field;
15+
import java.util.*;
16+
17+
18+
public class ClassEnumExtension extends Extension {
19+
20+
public static final String CFG_CLASS_ENUM_PATTERN = "classEnumPattern";
21+
22+
private String classEnumPattern = "ClassEnum";
23+
24+
@Override
25+
public EmitterExtensionFeatures getFeatures() {
26+
return new EmitterExtensionFeatures();
27+
}
28+
29+
@Override
30+
public void setConfiguration(Map<String, String> configuration) throws RuntimeException {
31+
if (configuration.containsKey(CFG_CLASS_ENUM_PATTERN)) {
32+
classEnumPattern = configuration.get(CFG_CLASS_ENUM_PATTERN);
33+
}
34+
}
35+
36+
@Override
37+
public List<TransformerDefinition> getTransformers() {
38+
return Arrays.asList(new TransformerDefinition(ModelCompiler.TransformationPhase.BeforeEnums, new ModelTransformer() {
39+
@Override
40+
public TsModel transformModel(SymbolTable symbolTable, TsModel model) {
41+
List<TsBeanModel> beans = model.getBeans();
42+
43+
List<TsBeanModel> classEnums = new ArrayList<>();
44+
for (TsBeanModel bean : beans) {
45+
if (bean.getName().getSimpleName().contains(classEnumPattern))
46+
classEnums.add(bean);
47+
}
48+
49+
List<TsEnumModel> stringEnums = new ArrayList<>();
50+
for (TsBeanModel tsBeanModel : classEnums) {
51+
List<EnumMemberModel> members = new ArrayList<>();
52+
for (Field declaredField : tsBeanModel.getOrigin().getDeclaredFields()) {
53+
if (declaredField.getType().getName().equals(tsBeanModel.getOrigin().getName())) {
54+
members.add(new EnumMemberModel(declaredField.getName(), declaredField.getName(), null));
55+
}
56+
}
57+
TsEnumModel temp = new TsEnumModel(
58+
tsBeanModel.getOrigin(),
59+
tsBeanModel.getName(),
60+
EnumKind.StringBased,
61+
members,
62+
null
63+
);
64+
stringEnums.add(temp);
65+
}
66+
67+
return model.withEnums(stringEnums).withoutBeans(classEnums);
68+
}
69+
}));
70+
}
71+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package cz.habarta.typescript.generator;
2+
3+
import com.fasterxml.jackson.annotation.JsonCreator;
4+
import com.fasterxml.jackson.annotation.JsonValue;
5+
6+
import java.util.Objects;
7+
8+
public class DummyClassEnum {
9+
10+
public static final DummyClassEnum ATYPE = new DummyClassEnum("ATYPE");
11+
public static final DummyClassEnum BTYPE = new DummyClassEnum("BTYPE");
12+
public static final DummyClassEnum CTYPE = new DummyClassEnum("CTYPE");
13+
14+
private final String value;
15+
16+
@JsonCreator
17+
public DummyClassEnum(String value) {
18+
this.value = Objects.requireNonNull(value);
19+
}
20+
21+
@JsonValue
22+
public String getValue() { return value; }
23+
24+
@Override
25+
public String toString() { return value; }
26+
27+
}

typescript-generator-core/src/test/java/cz/habarta/typescript/generator/EnumTest.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
import com.fasterxml.jackson.annotation.JsonFormat;
55
import com.fasterxml.jackson.annotation.JsonProperty;
66
import com.fasterxml.jackson.annotation.JsonValue;
7-
import com.fasterxml.jackson.core.JsonProcessingException;
8-
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import cz.habarta.typescript.generator.ext.ClassEnumExtension;
98
import java.util.*;
109
import static org.junit.Assert.*;
1110
import org.junit.Test;
@@ -95,6 +94,25 @@ public void testEnumAsEnum() {
9594
assertEquals(expected.trim(), output.trim());
9695
}
9796

97+
@Test
98+
public void testClassAsEnum() {
99+
final Settings settings = TestUtils.settings();
100+
settings.mapEnum = EnumMapping.asEnum;
101+
settings.jsonLibrary = JsonLibrary.jaxb;
102+
final ClassEnumExtension classEnumExtension = new ClassEnumExtension();
103+
classEnumExtension.setConfiguration(Collections.singletonMap("classEnumPattern", "ClassEnum"));
104+
settings.extensions.add(classEnumExtension);
105+
final String output = new TypeScriptGenerator(settings).generateTypeScript(Input.from(DummyClassEnum.class));
106+
final String expected = (
107+
"\ndeclare const enum DummyClassEnum {\n" +
108+
" ATYPE = 'ATYPE',\n" +
109+
" BTYPE = 'BTYPE',\n" +
110+
" CTYPE = 'CTYPE',\n" +
111+
"}\n"
112+
).replace("'", "\"");
113+
assertEquals(expected.trim(), output.trim());
114+
}
115+
98116
@Test
99117
public void testEnumWithJsonPropertyAnnotations() {
100118
final Settings settings = TestUtils.settings();

0 commit comments

Comments
 (0)