/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 2 1 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . serialization . json . internal Ċ Ċ import Ġkotlinx . serialization .* Ċ import Ġkotlinx . serialization . descriptors .* Ċ import Ġkotlinx . serialization . encoding .* Ċ import Ġkotlinx . serialization . encoding . Composite Decoder . Companion . UNKNOWN _ NAME Ċ import Ġkotlinx . serialization . json .* Ċ import Ġkotlinx . serialization . modules .* Ċ import Ġkotlin . jvm .* Ċ Ċ /** Ċ Ġ* Ġ[ Json Decoder ] Ġwhich Ġreads Ġgiven ĠJSON Ġfrom Ġ[ Json Lexer ] Ġfield Ġby Ġfield . Ċ Ġ*/ Ċ @ Opt In ( Experimental Serialization Api :: class , ĠExperimental Unsigned Types :: class ) Ċ internal Ġopen Ġclass ĠStreaming Json Decoder ( ĊĠĠĠ Ġfinal Ġoverride Ġval Ġjson : ĠJson , ĊĠĠĠ Ġprivate Ġval Ġmode : ĠWrite Mode , ĊĠĠĠ Ġ@ Jvm Field Ġinternal Ġval Ġlexer : ĠJson Lexer Ċ ) Ġ: ĠJson Decoder , ĠAbstract Decoder () Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġserializers Module : ĠSerial izers Module Ġ= Ġjson . serializers Module ĊĠĠĠ Ġprivate Ġvar ĠcurrentIndex Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġval Ġconfiguration Ġ= Ġjson . configuration ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Json Element (): ĠJson Element Ġ= ĠJson Tree Reader ( json . configuration , Ġlexer ). read () ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġdecode Serializable Value ( de serializer : ĠDeserial ization Strategy < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdecode Serializable Value Pol ymorphic ( de serializer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbegin Structure ( descriptor : ĠSerial Descriptor ): ĠComposite Decoder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Mode Ġ= Ġjson . switch Mode ( descriptor ) ĊĠĠĠĠĠĠĠ Ġlexer . consume NextToken ( new Mode . begin ) ĊĠĠĠĠĠĠĠ Ġcheck Leading Comma () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( new Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġfact Ġresets Ġcurrent Ġindex Ġthat Ġthese Ġmodes Ġrely Ġon ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWrite Mode . LIST , ĠWrite Mode . MAP , ĠWrite Mode . POLY _ OBJ Ġ-> ĠStreaming Json Decoder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Mode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlexer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( mode Ġ== Ġnew Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStreaming Json Decoder ( json , Ġnew Mode , Ġlexer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġend Structure ( descriptor : ĠSerial Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlexer . consume NextToken ( mode . end ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode NotNull Mark (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlexer . try Consume NotNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Null (): ĠNothing ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnothing , Ġnull Ġwas Ġconsumed Ġby Ġ` decode NotNull Mark ` ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Leading Comma () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( lexer . peek NextToken () Ġ== ĠTC _ COMMA ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlexer . fail (" Unexpected Ġleading Ġcomma ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Element Index ( descriptor : ĠSerial Descriptor ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWrite Mode . OBJ Ġ-> Ġdecode Object Index ( descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWrite Mode . MAP Ġ-> Ġdecode Map Index () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdecode List Index () Ġ// ĠBoth Ġfor ĠLIST Ġand Ġdefault Ġpol ymorphic ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecode Map Index (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġhas Comma Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġdecoding Key Ġ= ĠcurrentIndex Ġ% Ġ 2 Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( de coding Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Comma Ġ= Ġlexer . try Consume Comma () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlexer . consume NextToken ( COL ON ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( lexer . can Consume Value ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( de coding Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ== Ġ- 1 ) Ġlexer . require (! has Comma ) Ġ{ Ġ" Unexpected Ġtrailing Ġcomma " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġlexer . require ( has Comma ) Ġ{ Ġ" Expected Ġcomma Ġafter Ġthe Ġkey - value Ġpair " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ currentIndex ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Comma ) Ġlexer . fail (" Expected Ġ' }', Ġbut Ġhad Ġ',' Ġinstead ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComposite Decoder . DECODE _ DONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠChecks Ġwhether ĠJSON Ġhas Ġ` null ` Ġvalue Ġfor Ġnon - null Ġproperty Ġor Ġunknown Ġenum Ġvalue Ġfor Ġenum Ġproperty ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġco erce Input Value ( descriptor : ĠSerial Descriptor , Ġindex : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelement Descriptor Ġ= Ġdescriptor . getElement Descriptor ( index ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! element Descriptor . is Nullable Ġ&& Ġ! lexer . try Consume NotNull ()) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( element Descriptor . kind Ġ== ĠSerial Kind . ENUM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenum Value Ġ= Ġlexer . peek String ( configuration . is Len ient ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġfalse Ġ// Ġif Ġvalue Ġis Ġnot Ġa Ġstring , Ġdecode Enum () Ġwill Ġthrow Ġcorrect Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenum Index Ġ= Ġelement Descriptor . get Json Name Index ( json , Ġenum Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enum Index Ġ== ĠUNKNOWN _ NAME ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEn counter ed Ġunknown Ġenum Ġvalue , Ġhave Ġto Ġskip Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlexer . consume String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecode Object Index ( descriptor : ĠSerial Descriptor ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġhas Comma Ġchecks Ġare Ġrequired Ġto Ġproperly Ġreact Ġon Ġtrailing Ġcommas ĊĠĠĠĠĠĠĠ Ġvar Ġhas Comma Ġ= Ġlexer . try Consume Comma () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( lexer . can Consume Value ()) Ġ{ Ġ// ĠTODO : Ġconsider Ġmerging Ġcomma Ġconsumption Ġand Ġthis Ġcheck ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Comma Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġdecode String Key () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlexer . consume NextToken ( COL ON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġdescriptor . get Json Name Index ( json , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Unknown Ġ= Ġif Ġ( index Ġ!= ĠUNKNOWN _ NAME ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configuration . coerce Input Values Ġ&& Ġco erce Input Value ( descriptor , Ġindex )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Comma Ġ= Ġlexer . try Consume Comma () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ// ĠKnown Ġelement , Ġbut Ġco er ced ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġindex Ġ// ĠKnown Ġelement Ġwithout Ġco erc ing , Ġreturn Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ// Ġunknown Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Unknown ) Ġ{ Ġ// Ġslow - path Ġfor Ġunknown Ġkeys Ġhandling ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Comma Ġ= Ġhandle Unknown ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( has Comma ) Ġlexer . fail (" Unexpected Ġtrailing Ġcomma ") ĊĠĠĠĠĠĠĠ Ġreturn ĠComposite Decoder . DECODE _ DONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Unknown ( key : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . ignore Unknown Keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlexer . skip Element ( configuration . is Len ient ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlexer . fail On Unknown Key ( key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlexer . try Consume Comma () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecode List Index (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠPro hibit Ġleading Ġcomma ĊĠĠĠĠĠĠĠ Ġval Ġhas Comma Ġ= Ġlexer . try Consume Comma () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( lexer . can Consume Value ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ!= Ġ- 1 Ġ&& Ġ! has Comma ) Ġlexer . fail (" Expected Ġend Ġof Ġthe Ġarray Ġor Ġcomma ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ currentIndex ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Comma ) Ġlexer . fail (" Unexpected Ġtrailing Ġcomma ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComposite Decoder . DECODE _ DONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġdecode Boolean (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* ĠWe Ġpro hibit Ġnon Ġtrue / false Ġboolean Ġliterals Ġat Ġall Ġas Ġit Ġis Ġconsidered Ġway Ġtoo Ġerror - pr one , ĊĠĠĠĠĠĠĠĠ Ġ* Ġbut Ġallow Ġquoted Ġliteral Ġin Ġrelax ed Ġmode Ġfor Ġb ooleans . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( configuration . is Len ient ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlexer . consume Boolean Len ient () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlexer . consume Boolean () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠThe Ġrest Ġof Ġthe Ġprimitives Ġare Ġallowed Ġto Ġbe Ġquoted Ġand Ġun quoted ĊĠĠĠĠ Ġ* Ġto Ġsimplify Ġintegr ations Ġwith Ġthird - party ĠAPI . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġdecode Byte (): ĠByte Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġlexer . consume Numeric Literal () ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġfor Ġoverflow ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġvalue . to Byte (). to Long ()) Ġlexer . fail (" Failed Ġto Ġparse Ġbyte Ġfor Ġinput Ġ'$ value '") ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . to Byte () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Short (): ĠShort Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġlexer . consume Numeric Literal () ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġfor Ġoverflow ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġvalue . to Short (). to Long ()) Ġlexer . fail (" Failed Ġto Ġparse Ġshort Ġfor Ġinput Ġ'$ value '") ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . to Short () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Int (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġlexer . consume Numeric Literal () ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġfor Ġoverflow ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġvalue . toInt (). to Long ()) Ġlexer . fail (" Failed Ġto Ġparse Ġint Ġfor Ġinput Ġ'$ value '") ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Long (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlexer . consume Numeric Literal () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Float (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġlexer . parse String (" float ") Ġ{ Ġto Float () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġspecial Fp Ġ= Ġjson . configuration . allow Special Floating Point Values ĊĠĠĠĠĠĠĠ Ġif Ġ( special Fp Ġ|| Ġresult . is Finite ()) Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġlexer . throw Invalid Floating Point Decoded ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Double (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġlexer . parse String (" double ") Ġ{ Ġto Double () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġspecial Fp Ġ= Ġjson . configuration . allow Special Floating Point Values ĊĠĠĠĠĠĠĠ Ġif Ġ( special Fp Ġ|| Ġresult . is Finite ()) Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġlexer . throw Invalid Floating Point Decoded ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Char (): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring Ġ= Ġlexer . consume StringLen ient () ĊĠĠĠĠĠĠĠ Ġif Ġ( string . length Ġ!= Ġ 1 ) Ġlexer . fail (" Expected Ġsingle Ġchar , Ġbut Ġgot Ġ'$ string '") ĊĠĠĠĠĠĠĠ Ġreturn Ġstring [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecode String Key (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( configuration . is Len ient ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlexer . consume StringLen ient () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlexer . consume Key String () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode String (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( configuration . is Len ient ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlexer . consume StringLen ient () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlexer . consume String () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Inline ( inline Descriptor : ĠSerial Descriptor ): ĠDecoder Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( inline Descriptor . is Unsigned Number ) ĠJson Decoder For Unsigned Types ( lexer , Ġjson ) ĊĠĠĠĠĠĠĠ Ġelse Ġsuper . decode Inline ( inline Descriptor ) ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Enum ( enum Descriptor : ĠSerial Descriptor ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġenum Descriptor . get Json Name Index OrThrow ( json , Ġdecode String ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Opt In ( Experimental Serialization Api :: class ) Ċ @ Experimental Unsigned Types Ċ internal Ġclass ĠJson Decoder For Unsigned Types ( ĊĠĠĠ Ġprivate Ġval Ġlexer : ĠJson Lexer , ĊĠĠĠ Ġjson : ĠJson Ċ ) Ġ: ĠAbstract Decoder () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġserializers Module : ĠSerial izers Module Ġ= Ġjson . serializers Module ĊĠĠĠ Ġoverride Ġfun Ġdecode Element Index ( descriptor : ĠSerial Descriptor ): ĠInt Ġ= Ġerror (" unsupported ") ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Int (): ĠInt Ġ= Ġlexer . parse String (" UInt ") Ġ{ Ġto UInt (). toInt () Ġ} ĊĠĠĠ Ġoverride Ġfun Ġdecode Long (): ĠLong Ġ= Ġlexer . parse String (" UL ong ") Ġ{ Ġto UL ong (). to Long () Ġ} ĊĠĠĠ Ġoverride Ġfun Ġdecode Byte (): ĠByte Ġ= Ġlexer . parse String (" U Byte ") Ġ{ Ġto U Byte (). to Byte () Ġ} ĊĠĠĠ Ġoverride Ġfun Ġdecode Short (): ĠShort Ġ= Ġlexer . parse String (" U Short ") Ġ{ Ġto U Short (). to Short () Ġ} Ċ } Ċ Ċ private Ġinline Ġfun Ġ< T > ĠJson Lexer . parse String ( expected Type : ĠString , Ġblock : ĠString . () Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġval Ġinput Ġ= Ġconsume StringLen ient () ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinput . block () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfail (" Failed Ġto Ġparse Ġtype Ġ'$ expected Type ' Ġfor Ġinput Ġ'$ input '") ĊĠĠĠ Ġ} Ċ } Ċ