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