001/* 002 * Configurate 003 * Copyright (C) zml and Configurate contributors 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.spongepowered.configurate.extra.dfu.v4; 018 019import static java.util.Objects.requireNonNull; 020 021import com.mojang.serialization.Codec; 022import com.mojang.serialization.Lifecycle; 023import io.leangen.geantyref.TypeToken; 024import org.checkerframework.checker.nullness.qual.Nullable; 025import org.spongepowered.configurate.serialize.TypeSerializer; 026import org.spongepowered.configurate.serialize.TypeSerializerCollection; 027 028/** 029 * A bridge between Configurate and DataFixerUpper serialization types. 030 * 031 * @since 4.0.0 032 */ 033public final class DfuSerializers { 034 035 private DfuSerializers() { 036 } 037 038 /** 039 * Create a new serializer wrapping the provided {@link Codec}. 040 * 041 * @param codec codec to use for the serialization operation 042 * @param <V> value type 043 * @return a new serializer 044 * @since 4.0.0 045 */ 046 public static <V> TypeSerializer<V> serializer(final Codec<V> codec) { 047 return new CodecSerializer<>(requireNonNull(codec, "codec")); 048 } 049 050 /** 051 * Create a new codec that uses the default type serializer collection 052 * to serialize an object of the provided type. 053 * 054 * @param type token representing a value type 055 * @param <S> value type 056 * @return a codec for the type, or null if an appropriate 057 * {@link TypeSerializer} could not be found. 058 * @since 4.0.0 059 */ 060 public static <S> @Nullable Codec<S> codec(final TypeToken<S> type) { 061 return codec(requireNonNull(type, "type"), TypeSerializerCollection.defaults()); 062 } 063 064 /** 065 * Create a new codec based on a Configurate {@link TypeSerializer}. 066 * 067 * @param type type to serialize 068 * @param collection source for values 069 * @param <V> value type 070 * @return a codec, or null if an appropriate {@link TypeSerializer} 071 * could not be found for the TypeToken. 072 * @since 4.0.0 073 */ 074 public static <V> @Nullable Codec<V> codec(final TypeToken<V> type, final TypeSerializerCollection collection) { 075 final @Nullable TypeSerializer<V> serial = collection.get(requireNonNull(type, "type")); 076 if (serial == null) { 077 return null; 078 } 079 return new TypeSerializerCodec<>(type, serial, ConfigurateOps.forSerializers(collection)).withLifecycle(Lifecycle.stable()); 080 } 081 082}