package Ġspace . jetbrains . api . runtime Ċ Ċ import Ġkotlinx . datetime . Instant Ċ import Ġkotlinx . datetime . LocalDate Ċ import Ġmu . Kotlin Logging Ċ import Ġspace . jetbrains . api . runtime . Type . Number Type . Int Type Ċ import Ġspace . jetbrains . api . runtime . Type . Number Type . Long Type Ċ import Ġspace . jetbrains . api . runtime . Type . Primitive Type . StringType Ċ Ċ public Ġsealed Ġclass ĠType < T > Ġ{ ĊĠĠĠ Ġpublic Ġabstract Ġfun Ġdeserialize ( context : ĠDeserial ization Context ): ĠT ĊĠĠĠ Ġpublic Ġabstract Ġfun Ġserialize ( value : ĠT ): ĠJson Value ? ĊĊĠĠĠ Ġpublic Ġsealed Ġclass ĠNumber Type < T Ġ: ĠNumber > Ġ: ĠType < T >() Ġ{ ĊĠĠĠĠĠĠĠ Ġprotected Ġabstract Ġfun Ġfrom Number ( number : ĠNumber ): ĠT ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( context : ĠDeserial ization Context ): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfrom Number ( context . require Json (). as Number ( context . link )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠT ): ĠJson Value Ġ= Ġjson Number ( value ) ĊĊĠĠĠĠĠĠĠ Ġpublic Ġobject ĠByte Type Ġ: ĠNumber Type < Byte >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom Number ( number : ĠNumber ): ĠByte Ġ= Ġnumber . to Byte () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpublic Ġobject ĠShort Type Ġ: ĠNumber Type < Short >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom Number ( number : ĠNumber ): ĠShort Ġ= Ġnumber . to Short () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpublic Ġobject ĠInt Type Ġ: ĠNumber Type < Int >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom Number ( number : ĠNumber ): ĠInt Ġ= Ġnumber . toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpublic Ġobject ĠLong Type Ġ: ĠNumber Type < Long >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom Number ( number : ĠNumber ): ĠLong Ġ= Ġnumber . to Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpublic Ġobject ĠFloat Type Ġ: ĠNumber Type < Float >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom Number ( number : ĠNumber ): ĠFloat Ġ= Ġnumber . toFloat () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpublic Ġobject ĠDouble Type Ġ: ĠNumber Type < Double >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom Number ( number : ĠNumber ): ĠDouble Ġ= Ġnumber . toDouble () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġsealed Ġclass ĠPrimitive Type < T Ġ: ĠAny > Ġ: ĠType < T >() Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġobject ĠBoolean Type Ġ: ĠPrimitive Type < Boolean >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( context : ĠDeserial ization Context ): ĠBoolean Ġ= Ġcontext . require Json (). as Boolean ( context . link ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠBoolean ): ĠJson Value Ġ= Ġjson Boolean ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpublic Ġobject ĠString Type Ġ: ĠPrimitive Type < String >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( context : ĠDeserial ization Context ): ĠString Ġ= Ġcontext . require Json (). asString ( context . link ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠString ): ĠJson Value Ġ= Ġjson String ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpublic Ġobject ĠDate Type Ġ: ĠPrimitive Type < LocalDate >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( context : ĠDeserial ization Context ): ĠLocalDate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLocalDate . parse ( StringType . deserialize ( context . child (" iso "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠLocalDate ): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠjsonObject (" iso " Ġto Ġjson String ( value . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpublic Ġobject ĠDateTime Type Ġ: ĠPrimitive Type < Instant >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( context : ĠDeserial ization Context ): ĠInstant Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠInstant . from Epoch Milliseconds ( Long Type . deserialize ( context . child (" timestamp "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠInstant ): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠjsonObject (" timestamp " Ġto Ġjson Number ( value . to Epoch Milliseconds ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġclass ĠNullable < T Ġ: ĠAny >( public Ġval Ġtype : ĠType < T >) Ġ: ĠType < T ?> () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( context : ĠDeserial ization Context ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( context . json Ġ!= Ġnull Ġ&& Ġ! context . json . isNull ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Deserialize ( context . link ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . deserialize ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. value OrNull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠT ?): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue ?. let Ġ{ Ġtype . serialize ( it ) Ġ} Ġ?: Ġjson Null () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġclass ĠOptional < T >( public Ġval Ġtype : ĠType < T >) Ġ: ĠType < Option < T >>() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( context : ĠDeserial ization Context ): ĠOption < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( context . json Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOption . Value ( type . deserialize ( context )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠOption . None ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠOption < T >): ĠJson Value ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( value Ġas ? ĠOption . Value )?. let Ġ{ Ġtype . serialize ( it . value ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġclass ĠArray Type < T >( public Ġval Ġelement Type : ĠType < T >) Ġ: ĠType < List < T >>() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( context : ĠDeserial ization Context ): ĠList < T > Ġ= Ġmutable ListOf < T >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . elements (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Deserialize ( context . link ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Type . deserialize ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. if Value Ġ{ Ġadd ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠList < T >): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġjson Array (* Array ( value . size ) Ġ{ Ġelement Type . serialize ( value [ it ]) !! Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġclass ĠMap Type < V >( public Ġval Ġvalue Type : ĠType < V >) Ġ: ĠType < Map < String , ĠV >>() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( context : ĠDeserial ization Context ): ĠMap < String , ĠV > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmutable Map Of < String , ĠV >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . require Json (). get Fields ( context . link ). forEach Ġ{ Ġ( key , Ġjson ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelem Context Ġ= Ġcontext . child ("[ \" $ key \"] ", Ġjson , Ġpartial Ġ= Ġcontext . partial ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Deserialize ( elem Context . link ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Type . deserialize ( elem Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. if Value Ġ{ Ġput ( key , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠMap < String , ĠV >): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠjsonObject ( value . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . key Ġto Ġ( valueType . serialize ( it . value ) Ġ?: Ġerror (" Map Ġvalues Ġcannot Ġbe Ġoptional ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġclass ĠBatch Type < T >( public Ġval Ġelement Type : ĠType < T >) Ġ: ĠType < Batch < T >>() Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġarray Type Ġ= ĠArray Type ( elementType ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( context : ĠDeserial ization Context ): ĠBatch < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBatch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString Type . deserialize ( context . child (" next ", Ġpartial Ġ= Ġcontext . partial )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNullable ( Int Type ). deserialize ( context . child (" total Count ", Ġpartial Ġ= Ġcontext . partial )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Type . deserialize ( context . child (" data ", Ġpartial Ġ= Ġcontext . partial )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠBatch < T >): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠjsonObject ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" next " Ġto Ġjson String ( value . next ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" total Count " Ġto Ġ( value . total Count ?. let Ġ{ Ġjson Number ( it ) Ġ} Ġ?: Ġjson Null ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" data " Ġto Ġarray Type . serialize ( value . data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġclass ĠObjectType < T Ġ: ĠAny >( public Ġval Ġstructure : ĠType Structure < T >) Ġ: ĠType < T >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( context : ĠDeserial ization Context ): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . require Json () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstructure . deserialize ( context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠT ): ĠJson Value Ġ= Ġstructure . serialize ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġclass ĠEnum Type < T Ġ: ĠEnum < T >> Ġ@ Published Api Ġinternal Ġconstructor ( private Ġval Ġvalues : ĠList < T >) Ġ: ĠType < T >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( context : ĠDeserial ization Context ): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠString Type . deserialize ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalues . first Ġ{ Ġit . name Ġ== Ġname Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠT ): ĠJson Value Ġ= Ġjson String ( value . name ) ĊĊĠĠĠĠĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġinline Ġoperator Ġfun Ġ< re ified ĠT Ġ: ĠEnum < T >> Ġinvoke (): ĠEnum Type < T > Ġ= ĠEnum Type ( enum Values < T >(). asList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpartial Structure (): ĠType Structure < *> ? Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNumber Type , Ġis ĠPrimitive Type , Ġis ĠEnum Type Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġis ĠNullable < *> Ġ-> Ġtype . partial Structure () ĊĠĠĠĠĠĠĠ Ġis ĠOptional < *> Ġ-> Ġtype . partial Structure () ĊĠĠĠĠĠĠĠ Ġis ĠArray Type < *> Ġ-> Ġelement Type . partial Structure () ĊĠĠĠĠĠĠĠ Ġis ĠMap Type < *> Ġ-> Ġvalue Type . partial Structure () ĊĠĠĠĠĠĠĠ Ġis ĠBatch Type < *> Ġ-> Ġelement Type . partial Structure () ĊĠĠĠĠĠĠĠ Ġis ĠObjectType Ġ-> Ġstructure ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< T > Ġtry Deserialize ( link : ĠReference Chain Link , Ġdeserialize : Ġ() Ġ-> ĠT ): ĠOption < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOption . Value ( deserialize ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠDeserial ization Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" Deserialization Ġfailed . ĠSetting Ġ" Ġ+ Ġlink . reference Chain () Ġ+ Ġ" Ġto Ġnull \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error : Ġ" Ġ+ Ġe . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDeserial ization Exception . Major Ġ-> Ġlog . error Ġ{ Ġmsg Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDeserial ization Exception . Minor Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . link Ġ=== Ġlink Ġ|| Ġe . link . parent Ġ=== Ġlink Ġ&& Ġe . link . name . startsWith (" [" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn Ġ{ Ġmsg Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error Ġ{ Ġmsg Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOption . None ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ