/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 1 9 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" Le aking This ") Ċ Ċ package Ġkotlinx . serialization . json . internal Ċ Ċ import Ġkotlinx . serialization .* Ċ import Ġkotlinx . serialization . internal . Enum Descriptor Ċ import Ġkotlinx . serialization . json .* Ċ import Ġkotlinx . serialization . modules . Serial Module Ċ import Ġkotlin . jvm . Jvm Field Ċ Ċ internal Ġfun Ġ< T > ĠJson . read Json ( element : ĠJson Element , Ġde serializer : ĠDeserial ization Strategy < T >): ĠT Ġ{ ĊĠĠĠ Ġval Ġinput Ġ= Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠJsonObject Ġ-> ĠJson Tree Input ( this , Ġelement ) ĊĠĠĠĠĠĠĠ Ġis ĠJson Array Ġ-> ĠJson Tree List Input ( this , Ġelement ) ĊĠĠĠĠĠĠĠ Ġis ĠJson Literal , ĠJson Null Ġ-> ĠJson Primitive Input ( this , Ġelement Ġas ĠJson Primitive ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġinput . decode ( de serializer ) Ċ } Ċ Ċ private Ġsealed Ġclass ĠAbstract Json Tree Input ( override Ġval Ġjson : ĠJson , Ġopen Ġval Ġobj : ĠJson Element ) ĊĠĠĠ Ġ: ĠNamed Value Decoder (), ĠJson Input Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġcontext : ĠSerial Module ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġjson . context ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġprotected Ġval Ġconfiguration Ġ= Ġjson . configuration ĊĊĠĠĠ Ġprivate Ġfun Ġcurrent Object () Ġ= Ġcurrent Tag OrNull ?. let Ġ{ Ġcurrent Element ( it ) Ġ} Ġ?: Ġobj ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Json (): ĠJson Element Ġ= Ġcurrent Object () ĊĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġoverride Ġval Ġupdate Mode : ĠUpdate Mode ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġconfiguration . update Mode ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġdecode Serializable Value ( de serializer : ĠDeserial ization Strategy < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdecode Serializable Value Pol ymorphic ( de serializer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcompose Name ( parent Name : ĠString , Ġchild Name : ĠString ): ĠString Ġ= Ġchild Name ĊĊĠĠĠ Ġoverride Ġfun Ġbegin Structure ( desc : ĠSerial Descriptor , Ġvar arg Ġtype Params : ĠK Serializer < *> ): ĠComposite Decoder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Object Ġ= Ġcurrent Object () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( desc . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStructure Kind . LIST Ġ-> ĠJson Tree List Input ( json , Ġcast ( current Object )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStructure Kind . MAP Ġ-> ĠJson TreeMap Input ( json , Ġcast ( current Object )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠJson Tree Input ( json , Ġcast ( current Object )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun ĠgetValue ( tag : ĠString ): ĠJson Primitive Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Element Ġ= Ġcurrent Element ( tag ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Element Ġas ? ĠJson Primitive Ġ?: Ġthrow ĠJson ElementType Mismatch Exception ("$ current Element Ġat Ġ$ tag ", Ġ" Json Primitive ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġcurrent Element ( tag : ĠString ): ĠJson Element ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Tagged Char ( tag : ĠString ): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġo Ġ= ĠgetValue ( tag ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( o . content . length Ġ== Ġ 1 ) Ġo . content [ 0 ] Ġelse Ġthrow ĠSerialization Exception ("$ o Ġcan 't Ġbe Ġrepresented Ġas ĠChar ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Tagged Enum ( tag : ĠString , Ġenum Description : ĠEnum Descriptor ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġenum Description . getElement Index OrThrow ( getValue ( tag ). content ) ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Tagged Null ( tag : ĠString ): ĠNothing ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Tagged NotNull Mark ( tag : ĠString ): ĠBoolean Ġ= Ġcurrent Element ( tag ) Ġ!== ĠJson Null ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Tagged Unit ( tag : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Tagged Boolean ( tag : ĠString ): ĠBoolean Ġ= ĠgetValue ( tag ). boolean ĊĠĠĠ Ġoverride Ġfun Ġdecode Tagged Byte ( tag : ĠString ): ĠByte Ġ= ĠgetValue ( tag ). int . to Byte () ĊĠĠĠ Ġoverride Ġfun Ġdecode Tagged Short ( tag : ĠString ) Ġ= ĠgetValue ( tag ). int . to Short () ĊĠĠĠ Ġoverride Ġfun Ġdecode Tagged Int ( tag : ĠString ) Ġ= ĠgetValue ( tag ). int ĊĠĠĠ Ġoverride Ġfun Ġdecode Tagged Long ( tag : ĠString ) Ġ= ĠgetValue ( tag ). long ĊĠĠĠ Ġoverride Ġfun Ġdecode Tagged Float ( tag : ĠString ) Ġ= ĠgetValue ( tag ). float ĊĠĠĠ Ġoverride Ġfun Ġdecode Tagged Double ( tag : ĠString ) Ġ= ĠgetValue ( tag ). double ĊĠĠĠ Ġoverride Ġfun Ġdecode Tagged String ( tag : ĠString ) Ġ= ĠgetValue ( tag ). content Ċ } Ċ Ċ private Ġclass ĠJson Primitive Input ( json : ĠJson , Ġoverride Ġval Ġobj : ĠJson Primitive ) Ġ: ĠAbstract Json Tree Input ( json , Ġobj ) Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġpush Tag ( PR IMIT IVE _ TAG ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcurrent Element ( tag : ĠString ): ĠJson Element Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( tag Ġ=== ĠPR IMIT IVE _ TAG ) Ġ{ Ġ" This Ġinput Ġcan Ġonly Ġhandle Ġprimitives Ġwith Ġ'$ PR IMIT IVE _ TAG ' Ġtag " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġobj ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġopen Ġclass ĠJson Tree Input ( json : ĠJson , Ġoverride Ġval Ġobj : ĠJsonObject ) Ġ: ĠAbstract Json Tree Input ( json , Ġobj ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġposition Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Element Index ( desc : ĠSerial Descriptor ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( position Ġ< Ġdesc . elements Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġdesc . getTag ( position ++) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġin Ġobj ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġposition Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠComposite Decoder . READ _ DONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcurrent Element ( tag : ĠString ): ĠJson Element Ġ= Ġobj . getValue ( tag ) ĊĊĠĠĠ Ġoverride Ġfun Ġend Structure ( desc : ĠSerial Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! configuration . strict Mode Ġ|| Ġdesc Ġis ĠPol ymorphic Class Descriptor ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠValidate Ġkeys ĊĠĠĠĠĠĠĠ Ġval Ġnames Ġ= ĠHashSet < String >( desc . elements Count ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġdesc . elements Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnames Ġ+= Ġdesc . getElement Name ( i ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġobj . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ! in Ġnames ) Ġthrow ĠJson Unknown Key Exception (" Encounter ed Ġan Ġunknown Ġkey Ġ'$ key '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠJson TreeMap Input ( json : ĠJson , Ġoverride Ġval Ġobj : ĠJsonObject ) Ġ: ĠJson Tree Input ( json , Ġobj ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġkeys Ġ= Ġobj . keys . toList () ĊĠĠĠ Ġprivate Ġval Ġsize : ĠInt Ġ= Ġkeys . size Ġ* Ġ 2 ĊĠĠĠ Ġprivate Ġvar Ġposition Ġ= Ġ- 1 ĊĊĠĠĠ Ġoverride Ġfun Ġelement Name ( desc : ĠSerial Descriptor , Ġindex : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġindex Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġreturn Ġkeys [ i ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Element Index ( desc : ĠSerial Descriptor ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( position Ġ< Ġsize Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġposition ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠComposite Decoder . READ _ DONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcurrent Element ( tag : ĠString ): ĠJson Element Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( position Ġ% Ġ 2 Ġ== Ġ 0 ) ĠJson Literal ( tag ) Ġelse Ġobj . getValue ( tag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġend Structure ( desc : ĠSerial Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing , Ġmaps Ġdo Ġnot Ġhave Ġstrict Ġkeys , Ġso Ġstrict Ġmode Ġcheck Ġis Ġomitted ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠJson Tree List Input ( json : ĠJson , Ġoverride Ġval Ġobj : ĠJson Array ) Ġ: ĠAbstract Json Tree Input ( json , Ġobj ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġsize Ġ= Ġobj . content . size ĊĠĠĠ Ġprivate Ġvar ĠcurrentIndex Ġ= Ġ- 1 ĊĊĠĠĠ Ġoverride Ġfun Ġelement Name ( desc : ĠSerial Descriptor , Ġindex : ĠInt ): ĠString Ġ= Ġ( index ). toString () ĊĊĠĠĠ Ġoverride Ġfun Ġcurrent Element ( tag : ĠString ): ĠJson Element Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobj [ tag . toInt ()] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Element Index ( desc : ĠSerial Descriptor ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( currentIndex Ġ< Ġsize Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠcurrentIndex ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠComposite Decoder . READ _ DONE ĊĠĠĠ Ġ} Ċ } Ċ