package net.minecraft.server.packs.resources; import com.google.common.collect.ImmutableMap; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.mojang.serialization.JsonOps; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.Collection; import java.util.Optional; import net.minecraft.server.packs.metadata.MetadataSectionType; import net.minecraft.server.packs.resources.ResourceMetadata.Builder.1; import net.minecraft.util.GsonHelper; public interface ResourceMetadata { ResourceMetadata EMPTY = new ResourceMetadata() { @Override public Optional getSection(MetadataSectionType type) { return Optional.empty(); } }; IoSupplier EMPTY_SUPPLIER = () -> EMPTY; static ResourceMetadata fromJsonStream(InputStream stream) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8)); ResourceMetadata var3; try { final JsonObject jsonObject = GsonHelper.parse(bufferedReader); var3 = new ResourceMetadata() { @Override public Optional getSection(MetadataSectionType type) { String string = type.name(); if (jsonObject.has(string)) { T object = type.codec().parse(JsonOps.INSTANCE, jsonObject.get(string)).getOrThrow(JsonParseException::new); return Optional.of(object); } else { return Optional.empty(); } } }; } catch (Throwable var5) { try { bufferedReader.close(); } catch (Throwable var4) { var5.addSuppressed(var4); } throw var5; } bufferedReader.close(); return var3; } Optional getSection(MetadataSectionType type); default ResourceMetadata copySections(Collection> serializers) { ResourceMetadata.Builder builder = new ResourceMetadata.Builder(); for (MetadataSectionType metadataSectionType : serializers) { this.copySection(builder, metadataSectionType); } return builder.build(); } private void copySection(ResourceMetadata.Builder builder, MetadataSectionType type) { this.getSection(type).ifPresent(object -> builder.put(type, (T)object)); } public static class Builder { private final ImmutableMap.Builder, Object> map = ImmutableMap.builder(); public ResourceMetadata.Builder put(MetadataSectionType type, T value) { this.map.put(type, value); return this; } public ResourceMetadata build() { ImmutableMap, Object> immutableMap = this.map.build(); return (ResourceMetadata)(immutableMap.isEmpty() ? ResourceMetadata.EMPTY : new 1(this, immutableMap)); } } }