diff options
author | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-05-10 02:58:16 -0400 |
---|---|---|
committer | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-05-10 03:16:53 -0400 |
commit | 7d5b40352c6680820c18c63a35d506b69a15d036 (patch) | |
tree | a1c7b7fbe16ccf9263fe401032d8f98d9f829760 /src/main/java/de/hysky/skyblocker/utils/datafixer | |
parent | 5eb9d273d2eb56cebaf0be0f90716b362916400b (diff) | |
download | Skyblocker-7d5b40352c6680820c18c63a35d506b69a15d036.tar.gz Skyblocker-7d5b40352c6680820c18c63a35d506b69a15d036.tar.bz2 Skyblocker-7d5b40352c6680820c18c63a35d506b69a15d036.zip |
Config Data Fixer
Skyblocker's Version of DFU
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/utils/datafixer')
-rw-r--r-- | src/main/java/de/hysky/skyblocker/utils/datafixer/JsonHelper.java | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/utils/datafixer/JsonHelper.java b/src/main/java/de/hysky/skyblocker/utils/datafixer/JsonHelper.java new file mode 100644 index 00000000..f7646d31 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/datafixer/JsonHelper.java @@ -0,0 +1,107 @@ +package de.hysky.skyblocker.utils.datafixer; + +import java.util.Optional; +import java.util.OptionalInt; + +import com.google.gson.JsonObject; + +import net.minecraft.util.annotation.MethodsReturnNonnullByDefault; + +/** + * Helper methods to assist in retrieving values nested in JSON objects. + * + * All methods are fully null safe, whether it be from passing a {@code null} root object or from encountering a nonexistent or null object/value. + * + * @author AzureAaron + * @see <a href="https://github.com/AzureAaron/aaron-mod/blob/1.20/src/main/java/net/azureaaron/mod/utils/JsonHelper.java">Aaron's Mod's JSON Helper</a> + */ +@MethodsReturnNonnullByDefault +public class JsonHelper { + + public static OptionalInt getInt(JsonObject root, String path) { + //If root is null + if (root == null) return OptionalInt.empty(); + + //Fast path for if we just want the field itself + if (!path.contains(".")) { + return root.has(path) && !root.get(path).isJsonNull() ? OptionalInt.of(root.get(path).getAsInt()) : OptionalInt.empty(); + } + + String[] split = path.split("\\."); + String propertyName = split[split.length - 1]; + String[] objects2Traverse = new String[split.length - 1]; + + //Get the traversal path + System.arraycopy(split, 0, objects2Traverse, 0, split.length - 1); + + JsonObject currentLevel = root; + + for (String objectName : objects2Traverse) { + if (currentLevel.has(objectName) && !currentLevel.get(objectName).isJsonNull()) { + currentLevel = currentLevel.getAsJsonObject(objectName); + } else { + return OptionalInt.empty(); + } + } + + return currentLevel.has(propertyName) && !currentLevel.get(propertyName).isJsonNull() ? OptionalInt.of(currentLevel.get(propertyName).getAsInt()) : OptionalInt.empty(); + } + + public static Optional<Boolean> getBoolean(JsonObject root, String path) { + //If root is null + if (root == null) return Optional.empty(); + + //Fast path for if we just want the field itself + if (!path.contains(".")) { + return root.has(path) && !root.get(path).isJsonNull() ? Optional.of(root.get(path).getAsBoolean()) : Optional.empty(); + } + + String[] split = path.split("\\."); + String propertyName = split[split.length - 1]; + String[] objects2Traverse = new String[split.length - 1]; + + //Get the traversal path + System.arraycopy(split, 0, objects2Traverse, 0, split.length - 1); + + JsonObject currentLevel = root; + + for (String objectName : objects2Traverse) { + if (currentLevel.has(objectName) && !currentLevel.get(objectName).isJsonNull()) { + currentLevel = currentLevel.getAsJsonObject(objectName); + } else { + return Optional.empty(); + } + } + + return currentLevel.has(propertyName) && !currentLevel.get(propertyName).isJsonNull() ? Optional.of(currentLevel.get(propertyName).getAsBoolean()) : Optional.empty(); + } + + public static Optional<String> getString(JsonObject root, String path) { + //If root is null + if (root == null) return Optional.empty(); + + //Fast path for if we just want the field itself + if (!path.contains(".")) { + return root.has(path) && !root.get(path).isJsonNull() ? Optional.of(root.get(path).getAsString()) : Optional.empty(); + } + + String[] split = path.split("\\."); + String propertyName = split[split.length - 1]; + String[] objects2Traverse = new String[split.length - 1]; + + //Get the traversal path + System.arraycopy(split, 0, objects2Traverse, 0, split.length - 1); + + JsonObject currentLevel = root; + + for (String objectName : objects2Traverse) { + if (currentLevel.has(objectName) && !currentLevel.get(objectName).isJsonNull()) { + currentLevel = currentLevel.getAsJsonObject(objectName); + } else { + return Optional.empty(); + } + } + + return currentLevel.has(propertyName) && !currentLevel.get(propertyName).isJsonNull() ? Optional.of(currentLevel.get(propertyName).getAsString()) : Optional.empty(); + } +} |