Skip to content

Commit ea135e4

Browse files
committed
Use type adapter to make enums lowercase
1 parent eb7090a commit ea135e4

3 files changed

Lines changed: 107 additions & 45 deletions

File tree

src/main/java/com/terraformersmc/modmenu/ModMenu.java

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.terraformersmc.modmenu.config.ModMenuConfig;
1111
import com.terraformersmc.modmenu.config.ModMenuConfigManager;
1212
import com.terraformersmc.modmenu.event.ModMenuEventHandler;
13+
import com.terraformersmc.modmenu.util.EnumToLowerCaseJsonConverter;
1314
import com.terraformersmc.modmenu.util.ModMenuScreenTexts;
1415
import com.terraformersmc.modmenu.util.UpdateCheckerUtil;
1516
import com.terraformersmc.modmenu.util.mod.Mod;
@@ -34,8 +35,16 @@ public class ModMenu implements ClientModInitializer {
3435
public static final String MOD_ID = "modmenu";
3536
public static final String GITHUB_REF = "TerraformersMC/ModMenu";
3637
public static final Logger LOGGER = LoggerFactory.getLogger("Mod Menu");
37-
public static final Gson GSON = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).setPrettyPrinting().create();
38-
public static final Gson GSON_MINIFIED = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
38+
public static final Gson GSON;
39+
public static final Gson GSON_MINIFIED;
40+
41+
static {
42+
GsonBuilder builder = new GsonBuilder()
43+
.registerTypeHierarchyAdapter(Enum.class, new EnumToLowerCaseJsonConverter())
44+
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
45+
GSON = builder.setPrettyPrinting().create();
46+
GSON_MINIFIED = builder.create();
47+
}
3948

4049
public static final Map<String, Mod> MODS = new HashMap<>();
4150
public static final Map<String, Mod> ROOT_MODS = new HashMap<>();
@@ -168,21 +177,37 @@ public static boolean areModUpdatesAvailable() {
168177

169178
public static String getDisplayedModCount() {
170179
if (cachedDisplayedModCount == -1) {
180+
boolean includeChildren = ModMenuConfig.COUNT_CHILDREN.getValue();
181+
boolean includeLibraries = ModMenuConfig.COUNT_LIBRARIES.getValue();
182+
boolean includeHidden = ModMenuConfig.COUNT_HIDDEN_MODS.getValue();
183+
171184
// listen, if you have >= 2^32 mods then that's on you
172-
cachedDisplayedModCount = Math.toIntExact(MODS.values().stream().filter(mod ->
173-
(ModMenuConfig.COUNT_CHILDREN.getValue() || mod.getParent() == null) &&
174-
(ModMenuConfig.COUNT_LIBRARIES.getValue() || !mod.getBadges().contains(Mod.Badge.LIBRARY)) &&
175-
(ModMenuConfig.COUNT_HIDDEN_MODS.getValue() || !mod.isHidden())
176-
).count());
185+
cachedDisplayedModCount = Math.toIntExact(MODS.values().stream().filter(mod -> {
186+
boolean isChild = mod.getParent() != null;
187+
if (!includeChildren && isChild) {
188+
return false;
189+
}
190+
boolean isLibrary = mod.getBadges().contains(Mod.Badge.LIBRARY);
191+
if (!includeLibraries && isLibrary) {
192+
return false;
193+
}
194+
if (!includeHidden && mod.isHidden()) {
195+
return false;
196+
}
197+
198+
return true;
199+
}).count());
177200
}
178201
return NumberFormat.getInstance().format(cachedDisplayedModCount);
179202
}
180203

181204
public static Text createModsButtonText(boolean title) {
182205
var titleStyle = ModMenuConfig.MODS_BUTTON_STYLE.getValue();
183206
var gameMenuStyle = ModMenuConfig.GAME_MENU_BUTTON_STYLE.getValue();
184-
var isIcon = title ? titleStyle == ModMenuConfig.TitleMenuButtonStyle.ICON : gameMenuStyle == ModMenuConfig.GameMenuButtonStyle.ICON;
185-
var isShort = title ? titleStyle == ModMenuConfig.TitleMenuButtonStyle.SHRINK : gameMenuStyle == ModMenuConfig.GameMenuButtonStyle.REPLACE_BUGS;
207+
var isIcon = title ? titleStyle == ModMenuConfig.TitleMenuButtonStyle.ICON : gameMenuStyle ==
208+
ModMenuConfig.GameMenuButtonStyle.ICON;
209+
var isShort = title ? titleStyle == ModMenuConfig.TitleMenuButtonStyle.SHRINK : gameMenuStyle ==
210+
ModMenuConfig.GameMenuButtonStyle.REPLACE_BUGS;
186211
MutableText modsText = ModMenuScreenTexts.TITLE.copy();
187212
if (ModMenuConfig.MOD_COUNT_LOCATION.getValue().isOnModsButton() && !isIcon) {
188213
String count = ModMenu.getDisplayedModCount();

src/main/java/com/terraformersmc/modmenu/config/ModMenuConfig.java

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.terraformersmc.modmenu.config;
22

3-
import com.google.gson.annotations.SerializedName;
43
import com.terraformersmc.modmenu.api.UpdateChannel;
54
import com.terraformersmc.modmenu.config.option.BooleanConfigOption;
65
import com.terraformersmc.modmenu.config.option.EnumConfigOption;
@@ -21,16 +20,16 @@ public class ModMenuConfig {
2120
public static final BooleanConfigOption COUNT_LIBRARIES = new BooleanConfigOption("count_libraries", true);
2221
public static final BooleanConfigOption COMPACT_LIST = new BooleanConfigOption("compact_list", false);
2322
public static final BooleanConfigOption COUNT_CHILDREN = new BooleanConfigOption("count_children", true);
24-
public static final EnumConfigOption<TitleMenuButtonStyle> MODS_BUTTON_STYLE = new EnumConfigOption<>(
25-
"mods_button_style",
26-
TitleMenuButtonStyle.CLASSIC);
27-
public static final EnumConfigOption<GameMenuButtonStyle> GAME_MENU_BUTTON_STYLE = new EnumConfigOption<>(
28-
"game_menu_button_style",
29-
GameMenuButtonStyle.REPLACE_BUGS);
23+
public static final EnumConfigOption<TitleMenuButtonStyle> MODS_BUTTON_STYLE = new EnumConfigOption<>("mods_button_style",
24+
TitleMenuButtonStyle.CLASSIC
25+
);
26+
public static final EnumConfigOption<GameMenuButtonStyle> GAME_MENU_BUTTON_STYLE = new EnumConfigOption<>("game_menu_button_style",
27+
GameMenuButtonStyle.REPLACE_BUGS
28+
);
3029
public static final BooleanConfigOption COUNT_HIDDEN_MODS = new BooleanConfigOption("count_hidden_mods", true);
31-
public static final EnumConfigOption<ModCountLocation> MOD_COUNT_LOCATION = new EnumConfigOption<>(
32-
"mod_count_location",
33-
ModCountLocation.TITLE_SCREEN);
30+
public static final EnumConfigOption<ModCountLocation> MOD_COUNT_LOCATION = new EnumConfigOption<>("mod_count_location",
31+
ModCountLocation.TITLE_SCREEN
32+
);
3433
public static final BooleanConfigOption HIDE_MOD_LINKS = new BooleanConfigOption("hide_mod_links", false);
3534
public static final BooleanConfigOption SHOW_LIBRARIES = new BooleanConfigOption("show_libraries", false);
3635
public static final BooleanConfigOption HIDE_MOD_LICENSE = new BooleanConfigOption("hide_mod_license", false);
@@ -39,12 +38,10 @@ public class ModMenuConfig {
3938
public static final BooleanConfigOption EASTER_EGGS = new BooleanConfigOption("easter_eggs", true);
4039
public static final BooleanConfigOption RANDOM_JAVA_COLORS = new BooleanConfigOption("random_java_colors", false);
4140
public static final BooleanConfigOption TRANSLATE_NAMES = new BooleanConfigOption("translate_names", true);
42-
public static final BooleanConfigOption TRANSLATE_DESCRIPTIONS = new BooleanConfigOption("translate_descriptions",
43-
true);
41+
public static final BooleanConfigOption TRANSLATE_DESCRIPTIONS = new BooleanConfigOption("translate_descriptions", true);
4442
public static final BooleanConfigOption UPDATE_CHECKER = new BooleanConfigOption("update_checker", true);
4543
public static final BooleanConfigOption BUTTON_UPDATE_BADGE = new BooleanConfigOption("button_update_badge", true);
46-
public static final EnumConfigOption<UpdateChannel> UPDATE_CHANNEL = new EnumConfigOption<>("update_channel",
47-
UpdateChannel.RELEASE);
44+
public static final EnumConfigOption<UpdateChannel> UPDATE_CHANNEL = new EnumConfigOption<>("update_channel", UpdateChannel.RELEASE);
4845
public static final BooleanConfigOption QUICK_CONFIGURE = new BooleanConfigOption("quick_configure", true);
4946

5047
@FileOnlyConfig
@@ -56,17 +53,13 @@ public class ModMenuConfig {
5653
@FileOnlyConfig
5754
public static final BooleanConfigOption CONFIG_MODE = new BooleanConfigOption("config_mode", false);
5855
@FileOnlyConfig
59-
public static final BooleanConfigOption DISABLE_DRAG_AND_DROP = new BooleanConfigOption("disable_drag_and_drop",
60-
false);
56+
public static final BooleanConfigOption DISABLE_DRAG_AND_DROP = new BooleanConfigOption("disable_drag_and_drop", false);
6157
@FileOnlyConfig
6258
public static final StringSetConfigOption HIDDEN_MODS = new StringSetConfigOption("hidden_mods", new HashSet<>());
6359
@FileOnlyConfig
64-
public static final StringSetConfigOption HIDDEN_CONFIGS = new StringSetConfigOption("hidden_configs",
65-
new HashSet<>());
60+
public static final StringSetConfigOption HIDDEN_CONFIGS = new StringSetConfigOption("hidden_configs", new HashSet<>());
6661
@FileOnlyConfig
67-
public static final StringSetConfigOption DISABLE_UPDATE_CHECKER = new StringSetConfigOption(
68-
"disable_update_checker",
69-
new HashSet<>());
62+
public static final StringSetConfigOption DISABLE_UPDATE_CHECKER = new StringSetConfigOption("disable_update_checker", new HashSet<>());
7063

7164
public static SimpleOption<?>[] asOptions() {
7265
ArrayList<SimpleOption<?>> options = new ArrayList<>();
@@ -84,11 +77,10 @@ public static SimpleOption<?>[] asOptions() {
8477
}
8578

8679
public enum Sorting {
87-
@SerializedName("ascending") ASCENDING(Comparator.comparing(mod -> mod.getTranslatedName()
88-
.toLowerCase(Locale.ROOT))),
89-
@SerializedName("descending") DESCENDING(ASCENDING.getComparator().reversed());
80+
ASCENDING(Comparator.comparing(mod -> mod.getTranslatedName().toLowerCase(Locale.ROOT))),
81+
DESCENDING(ASCENDING.getComparator().reversed());
9082

91-
Comparator<Mod> comparator;
83+
private final Comparator<Mod> comparator;
9284

9385
Sorting(Comparator<Mod> comparator) {
9486
this.comparator = comparator;
@@ -100,10 +92,10 @@ public Comparator<Mod> getComparator() {
10092
}
10193

10294
public enum ModCountLocation {
103-
@SerializedName("title_screen") TITLE_SCREEN(true, false),
104-
@SerializedName("mods_button") MODS_BUTTON(false, true),
105-
@SerializedName("title_screen_and_mods_button") TITLE_SCREEN_AND_MODS_BUTTON(true, true),
106-
@SerializedName("none") NONE(false, false);
95+
TITLE_SCREEN(true, false),
96+
MODS_BUTTON(false, true),
97+
TITLE_SCREEN_AND_MODS_BUTTON(true, true),
98+
NONE(false, false);
10799

108100
private final boolean titleScreen, modsButton;
109101

@@ -122,15 +114,15 @@ public boolean isOnModsButton() {
122114
}
123115

124116
public enum TitleMenuButtonStyle {
125-
@SerializedName("classic") CLASSIC(),
126-
@SerializedName("replace_realms") REPLACE_REALMS(),
127-
@SerializedName("shrink") SHRINK(),
128-
@SerializedName("icon") ICON();
117+
CLASSIC(),
118+
REPLACE_REALMS(),
119+
SHRINK(),
120+
ICON();
129121
}
130122

131123
public enum GameMenuButtonStyle {
132-
@SerializedName("replace_bugs") REPLACE_BUGS,
133-
@SerializedName("below_bugs") BELOW_BUGS,
134-
@SerializedName("icon") ICON;
124+
REPLACE_BUGS,
125+
BELOW_BUGS,
126+
ICON;
135127
}
136128
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.terraformersmc.modmenu.util;
2+
3+
import com.google.gson.*;
4+
5+
import java.lang.reflect.Type;
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
9+
public final class EnumToLowerCaseJsonConverter implements JsonSerializer<Enum<?>>, JsonDeserializer<Enum<?>> {
10+
private static final Map<String, Class<? extends Enum<?>>> TYPE_CACHE = new HashMap<>();
11+
12+
@Override
13+
public JsonElement serialize(final Enum<?> src, final Type typeOfSrc, final JsonSerializationContext context) {
14+
if (src == null) {
15+
return JsonNull.INSTANCE;
16+
}
17+
return new JsonPrimitive(src.name().toLowerCase());
18+
}
19+
20+
@Override
21+
public Enum<?> deserialize(final JsonElement json,
22+
final Type type,
23+
final JsonDeserializationContext context) throws JsonParseException {
24+
if (json == null || json.isJsonNull()) {
25+
return null;
26+
}
27+
28+
if (!json.isJsonPrimitive() || !json.getAsJsonPrimitive().isString()) {
29+
throw new JsonParseException("Expecting a String JsonPrimitive, getting " + json);
30+
}
31+
32+
try {
33+
final String enumClassName = type.getTypeName();
34+
Class<? extends Enum<?>> enumClass = TYPE_CACHE.get(enumClassName);
35+
if (enumClass == null) {
36+
enumClass = (Class<? extends Enum<?>>) Class.forName(enumClassName);
37+
TYPE_CACHE.put(enumClassName, enumClass);
38+
}
39+
40+
return Enum.valueOf((Class) enumClass, json.getAsString().toUpperCase());
41+
} catch (final ClassNotFoundException e) {
42+
throw new JsonParseException(e);
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)