85 lines
2.8 KiB
Java
85 lines
2.8 KiB
Java
package net.minecraft.server.packs.resources;
|
|
|
|
import com.google.common.collect.ImmutableMap;
|
|
import com.google.gson.JsonObject;
|
|
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.MetadataSectionSerializer;
|
|
import net.minecraft.util.GsonHelper;
|
|
|
|
public interface ResourceMetadata {
|
|
ResourceMetadata EMPTY = new ResourceMetadata() {
|
|
@Override
|
|
public <T> Optional<T> getSection(MetadataSectionSerializer<T> serializer) {
|
|
return Optional.empty();
|
|
}
|
|
};
|
|
IoSupplier<ResourceMetadata> 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 <T> Optional<T> getSection(MetadataSectionSerializer<T> serializer) {
|
|
String string = serializer.getMetadataSectionName();
|
|
return jsonObject.has(string) ? Optional.of(serializer.fromJson(GsonHelper.getAsJsonObject(jsonObject, string))) : Optional.empty();
|
|
}
|
|
};
|
|
} catch (Throwable var5) {
|
|
try {
|
|
bufferedReader.close();
|
|
} catch (Throwable var4) {
|
|
var5.addSuppressed(var4);
|
|
}
|
|
|
|
throw var5;
|
|
}
|
|
|
|
bufferedReader.close();
|
|
return var3;
|
|
}
|
|
|
|
<T> Optional<T> getSection(MetadataSectionSerializer<T> serializer);
|
|
|
|
default ResourceMetadata copySections(Collection<MetadataSectionSerializer<?>> serializers) {
|
|
ResourceMetadata.Builder builder = new ResourceMetadata.Builder();
|
|
|
|
for (MetadataSectionSerializer<?> metadataSectionSerializer : serializers) {
|
|
this.copySection(builder, metadataSectionSerializer);
|
|
}
|
|
|
|
return builder.build();
|
|
}
|
|
|
|
private <T> void copySection(ResourceMetadata.Builder builder, MetadataSectionSerializer<T> serializer) {
|
|
this.getSection(serializer).ifPresent(object -> builder.put(serializer, (T)object));
|
|
}
|
|
|
|
public static class Builder {
|
|
private final ImmutableMap.Builder<MetadataSectionSerializer<?>, Object> map = ImmutableMap.builder();
|
|
|
|
public <T> ResourceMetadata.Builder put(MetadataSectionSerializer<T> key, T value) {
|
|
this.map.put(key, value);
|
|
return this;
|
|
}
|
|
|
|
public ResourceMetadata build() {
|
|
final ImmutableMap<MetadataSectionSerializer<?>, Object> immutableMap = this.map.build();
|
|
return immutableMap.isEmpty() ? ResourceMetadata.EMPTY : new ResourceMetadata() {
|
|
@Override
|
|
public <T> Optional<T> getSection(MetadataSectionSerializer<T> serializer) {
|
|
return Optional.ofNullable(immutableMap.get(serializer));
|
|
}
|
|
};
|
|
}
|
|
}
|
|
}
|