package net.minecraft.client.telemetry; import com.mojang.serialization.DataResult; import com.mojang.serialization.DynamicOps; import com.mojang.serialization.MapCodec; import com.mojang.serialization.MapLike; import com.mojang.serialization.RecordBuilder; import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Stream; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import org.jetbrains.annotations.Nullable; @Environment(EnvType.CLIENT) public class TelemetryPropertyMap { final Map, Object> entries; TelemetryPropertyMap(Map, Object> entries) { this.entries = entries; } public static TelemetryPropertyMap.Builder builder() { return new TelemetryPropertyMap.Builder(); } public static MapCodec createCodec(List> properties) { return new MapCodec() { public RecordBuilder encode(TelemetryPropertyMap map, DynamicOps ops, RecordBuilder builder) { RecordBuilder recordBuilder = builder; for (TelemetryProperty telemetryProperty : properties) { recordBuilder = this.encodeProperty(map, recordBuilder, telemetryProperty); } return recordBuilder; } private RecordBuilder encodeProperty(TelemetryPropertyMap map, RecordBuilder builder, TelemetryProperty key) { V object = map.get(key); return object != null ? builder.add(key.id(), object, key.codec()) : builder; } @Override public DataResult decode(DynamicOps dynamicOps, MapLike mapLike) { DataResult dataResult = DataResult.success(new TelemetryPropertyMap.Builder()); for (TelemetryProperty telemetryProperty : properties) { dataResult = this.decodeProperty(dataResult, dynamicOps, mapLike, telemetryProperty); } return dataResult.map(TelemetryPropertyMap.Builder::build); } private DataResult decodeProperty( DataResult result, DynamicOps ops, MapLike value, TelemetryProperty property ) { T object = value.get(property.id()); if (object != null) { DataResult dataResult = property.codec().parse(ops, object); return result.apply2stable((builder, objectx) -> builder.put(property, (V)objectx), dataResult); } else { return result; } } @Override public Stream keys(DynamicOps dynamicOps) { return properties.stream().map(TelemetryProperty::id).map(dynamicOps::createString); } }; } @Nullable public T get(TelemetryProperty key) { return (T)this.entries.get(key); } public String toString() { return this.entries.toString(); } public Set> propertySet() { return this.entries.keySet(); } @Environment(EnvType.CLIENT) public static class Builder { private final Map, Object> entries = new Reference2ObjectOpenHashMap<>(); Builder() { } public TelemetryPropertyMap.Builder put(TelemetryProperty key, T value) { this.entries.put(key, value); return this; } public TelemetryPropertyMap.Builder putIfNotNull(TelemetryProperty key, @Nullable T value) { if (value != null) { this.entries.put(key, value); } return this; } public TelemetryPropertyMap.Builder putAll(TelemetryPropertyMap propertyMap) { this.entries.putAll(propertyMap.entries); return this; } public TelemetryPropertyMap build() { return new TelemetryPropertyMap(this.entries); } } }