1 /* 2 * Copyright 2017-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. 3 */ 4 5 package kotlinx.serialization.encoding 6 7 import kotlinx.serialization.* 8 import kotlinx.serialization.descriptors.* 9 10 /** 11 * A skeleton implementation of both [Decoder] and [CompositeDecoder] that can be used 12 * for simple formats and for testability purpose. 13 * Most of the `decode*` methods have default implementation that delegates `decodeValue(value: Any) as TargetType`. 14 * See [Decoder] documentation for information about each particular `decode*` method. 15 */ 16 @ExperimentalSerializationApi 17 public abstract class AbstractDecoder : Decoder, CompositeDecoder { 18 19 /** 20 * Invoked to decode a value when specialized `decode*` method was not overridden. 21 */ decodeValuenull22 public open fun decodeValue(): Any = throw SerializationException("${this::class} can't retrieve untyped values") 23 24 override fun decodeNotNullMark(): Boolean = true 25 override fun decodeNull(): Nothing? = null 26 override fun decodeBoolean(): Boolean = decodeValue() as Boolean 27 override fun decodeByte(): Byte = decodeValue() as Byte 28 override fun decodeShort(): Short = decodeValue() as Short 29 override fun decodeInt(): Int = decodeValue() as Int 30 override fun decodeLong(): Long = decodeValue() as Long 31 override fun decodeFloat(): Float = decodeValue() as Float 32 override fun decodeDouble(): Double = decodeValue() as Double 33 override fun decodeChar(): Char = decodeValue() as Char 34 override fun decodeString(): String = decodeValue() as String 35 override fun decodeEnum(enumDescriptor: SerialDescriptor): Int = decodeValue() as Int 36 37 override fun decodeInline(descriptor: SerialDescriptor): Decoder = this 38 39 // overwrite by default 40 public open fun <T : Any?> decodeSerializableValue( 41 deserializer: DeserializationStrategy<T>, 42 previousValue: T? = null 43 ): T = decodeSerializableValue(deserializer) 44 45 override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder = this 46 47 override fun endStructure(descriptor: SerialDescriptor) { 48 } 49 decodeBooleanElementnull50 final override fun decodeBooleanElement(descriptor: SerialDescriptor, index: Int): Boolean = decodeBoolean() 51 final override fun decodeByteElement(descriptor: SerialDescriptor, index: Int): Byte = decodeByte() 52 final override fun decodeShortElement(descriptor: SerialDescriptor, index: Int): Short = decodeShort() 53 final override fun decodeIntElement(descriptor: SerialDescriptor, index: Int): Int = decodeInt() 54 final override fun decodeLongElement(descriptor: SerialDescriptor, index: Int): Long = decodeLong() 55 final override fun decodeFloatElement(descriptor: SerialDescriptor, index: Int): Float = decodeFloat() 56 final override fun decodeDoubleElement(descriptor: SerialDescriptor, index: Int): Double = decodeDouble() 57 final override fun decodeCharElement(descriptor: SerialDescriptor, index: Int): Char = decodeChar() 58 final override fun decodeStringElement(descriptor: SerialDescriptor, index: Int): String = decodeString() 59 60 override fun decodeInlineElement( 61 descriptor: SerialDescriptor, 62 index: Int 63 ): Decoder = decodeInline(descriptor.getElementDescriptor(index)) 64 65 override fun <T> decodeSerializableElement( 66 descriptor: SerialDescriptor, 67 index: Int, 68 deserializer: DeserializationStrategy<T>, 69 previousValue: T? 70 ): T = decodeSerializableValue(deserializer, previousValue) 71 72 final override fun <T : Any> decodeNullableSerializableElement( 73 descriptor: SerialDescriptor, 74 index: Int, 75 deserializer: DeserializationStrategy<T?>, 76 previousValue: T? 77 ): T? = decodeIfNullable(deserializer) { 78 decodeSerializableValue(deserializer, previousValue) 79 } 80 } 81