• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package kotlinx.serialization.json.internal
2 
3 import kotlinx.serialization.*
4 import kotlinx.serialization.json.DecodeSequenceMode
5 import kotlinx.serialization.json.Json
6 
7 @RequiresOptIn(level = RequiresOptIn.Level.ERROR)
8 internal annotation class JsonFriendModuleApi
9 
10 @JsonFriendModuleApi
11 public interface InternalJsonWriter {
writeLongnull12     public fun writeLong(value: Long)
13     public fun writeChar(char: Char)
14     public fun write(text: String)
15     public fun writeQuoted(text: String)
16     public fun release()
17 }
18 
19 @JsonFriendModuleApi
20 public interface InternalJsonReader {
21     public fun read(buffer: CharArray, bufferOffset: Int, count: Int): Int
22 }
23 
24 @JsonFriendModuleApi
encodeByWriternull25 public fun <T> encodeByWriter(json: Json, writer: InternalJsonWriter, serializer: SerializationStrategy<T>, value: T) {
26     val encoder = StreamingJsonEncoder(
27         writer, json,
28         WriteMode.OBJ,
29         arrayOfNulls(WriteMode.entries.size)
30     )
31     encoder.encodeSerializableValue(serializer, value)
32 }
33 
34 @JsonFriendModuleApi
decodeByReadernull35 public fun <T> decodeByReader(
36     json: Json,
37     deserializer: DeserializationStrategy<T>,
38     reader: InternalJsonReader
39 ): T {
40     val lexer = ReaderJsonLexer(reader)
41     try {
42         val input = StreamingJsonDecoder(json, WriteMode.OBJ, lexer, deserializer.descriptor, null)
43         val result = input.decodeSerializableValue(deserializer)
44         lexer.expectEof()
45         return result
46     } finally {
47         lexer.release()
48     }
49 }
50 
51 @JsonFriendModuleApi
52 @ExperimentalSerializationApi
decodeToSequenceByReadernull53 public fun <T> decodeToSequenceByReader(
54     json: Json,
55     reader: InternalJsonReader,
56     deserializer: DeserializationStrategy<T>,
57     format: DecodeSequenceMode = DecodeSequenceMode.AUTO_DETECT
58 ): Sequence<T> {
59     val lexer = ReaderJsonLexer(reader, CharArray(BATCH_SIZE)) // Unpooled buffer due to lazy nature of sequence
60     val iter = JsonIterator(format, json, lexer, deserializer)
61     return Sequence { iter }.constrainOnce()
62 }
63 
64 @JsonFriendModuleApi
65 @ExperimentalSerializationApi
decodeToSequenceByReadernull66 public inline fun <reified T> decodeToSequenceByReader(
67     json: Json,
68     reader: InternalJsonReader,
69     format: DecodeSequenceMode = DecodeSequenceMode.AUTO_DETECT
70 ): Sequence<T> = decodeToSequenceByReader(json, reader, json.serializersModule.serializer(), format)
71