package Ġspace . jetbrains . api . runtime Ċ Ċ import Ġkotlinx . datetime . Instant Ċ import Ġkotlinx . datetime . LocalDate Ċ import Ġkotlin . js .* Ċ import Ġkotlin . properties .* Ċ import Ġkotlin . reflect .* Ċ Ċ public Ġabstract Ġclass ĠType Structure < D Ġ: ĠAny > Ġ{ ĊĠĠĠ Ġpublic Ġabstract Ġfun Ġdeserialize ( context : ĠDeserial ization Context ): ĠD ĊĠĠĠ Ġpublic Ġabstract Ġfun Ġserialize ( value : ĠD ): ĠJson Value ĊĠĠĠ Ġpublic Ġopen Ġval Ġchild ClassNames : ĠSet < String > Ġ= Ġempty Set () ĊĠĠĠ Ġpublic Ġabstract Ġval Ġis Record : ĠBoolean ĊĊĠĠĠ Ġprivate Ġval Ġproperties Ġ= Ġmutable Map Of < String , ĠProperty <* >>() ĊĊĠĠĠ Ġprotected Ġfun Ġ< T > ĠProperty < T >. deserialize ( context : ĠDeserial ization Context ): ĠProperty Value < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchild Context Ġ= Ġcontext . child ( name ) ĊĊĠĠĠĠĠĠĠ Ġval ĠshouldBe Included Ġ= Ġwhen Ġ( in clusion Strategy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIn clusion Strategy . ONLY _ EX PL IC IT Ġ-> Ġchild Context . partial Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIn clusion Strategy . ONLY _ EX PL IC IT _ OR _ PARENT _ EX PL IC IT Ġ-> Ġchild Context . partial Ġ!= Ġnull Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . partial Ġ!= Ġnull Ġ&& Ġcontext . partial . has All Default ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIn clusion Strategy . PARENT Ġ-> Ġchild Context . partial Ġ!= Ġnull Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . partial Ġ!= Ġnull Ġ&& Ġcontext . partial . has All Default ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġchild Context . json ?. let Ġ{ ĠProperty Value . Value ( type . deserialize ( child Context )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠProperty Value . None ( child Context . link , Ġreturn Null Ġ= Ġtype Ġis ĠType . Nullable < *> Ġ&& ĠshouldBe Included ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġ< T > ĠProperty < T >. serialize ( value : ĠT ): ĠPair < String , ĠJson Value >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtype . serialize ( value )?. let Ġ{ Ġname Ġto Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Js Name (" byte _ property ") ĊĠĠĠ Ġprotected Ġfun Ġbyte ( is Extension : ĠBoolean Ġ= Ġfalse ): ĠProperty Provider < Byte > Ġ= Ġproperty ( Type . Number Type . Byte Type , Ġis Extension ) ĊĊĠĠĠ Ġ@ Js Name (" short _ property ") ĊĠĠĠ Ġprotected Ġfun Ġshort ( is Extension : ĠBoolean Ġ= Ġfalse ): ĠProperty Provider < Short > Ġ= Ġproperty ( Type . Number Type . Short Type , Ġis Extension ) ĊĊĠĠĠ Ġ@ Js Name (" int _ property ") ĊĠĠĠ Ġprotected Ġfun Ġint ( is Extension : ĠBoolean Ġ= Ġfalse ): ĠProperty Provider < Int > Ġ= Ġproperty ( Type . Number Type . Int Type , Ġis Extension ) ĊĊĠĠĠ Ġ@ Js Name (" long _ property ") ĊĠĠĠ Ġprotected Ġfun Ġlong ( is Extension : ĠBoolean Ġ= Ġfalse ): ĠProperty Provider < Long > Ġ= Ġproperty ( Type . Number Type . Long Type , Ġis Extension ) ĊĊĠĠĠ Ġ@ Js Name (" float _ property ") ĊĠĠĠ Ġprotected Ġfun Ġfloat ( is Extension : ĠBoolean Ġ= Ġfalse ): ĠProperty Provider < Float > Ġ= Ġproperty ( Type . Number Type . Float Type , Ġis Extension ) ĊĊĠĠĠ Ġ@ Js Name (" double _ property ") ĊĠĠĠ Ġprotected Ġfun Ġdouble ( is Extension : ĠBoolean Ġ= Ġfalse ): ĠProperty Provider < Double > Ġ= Ġproperty ( Type . Number Type . Double Type , Ġis Extension ) ĊĊĠĠĠ Ġ@ Js Name (" boolean _ property ") ĊĠĠĠ Ġprotected Ġfun Ġboolean ( is Extension : ĠBoolean Ġ= Ġfalse ): ĠProperty Provider < Boolean > Ġ= Ġproperty ( Type . Primitive Type . Boolean Type , Ġis Extension ) ĊĊĠĠĠ Ġ@ Js Name (" date _ property ") ĊĠĠĠ Ġprotected Ġfun Ġdate ( is Extension : ĠBoolean Ġ= Ġfalse ): ĠProperty Provider < LocalDate > Ġ= Ġproperty ( Type . Primitive Type . Date Type , Ġis Extension ) ĊĊĠĠĠ Ġ@ Js Name (" datetime _ property ") ĊĠĠĠ Ġprotected Ġfun Ġdatetime ( is Extension : ĠBoolean Ġ= Ġfalse ): ĠProperty Provider < Instant > Ġ= Ġproperty ( Type . Primitive Type . DateTime Type , Ġis Extension ) ĊĊĠĠĠ Ġ@ Js Name (" string _ property ") ĊĠĠĠ Ġprotected Ġfun Ġstring ( is Extension : ĠBoolean Ġ= Ġfalse ): ĠProperty Provider < String > Ġ= Ġproperty ( Type . Primitive Type . StringType , Ġis Extension ) ĊĊĠĠĠ Ġ@ Js Name (" nullable _ property ") ĊĠĠĠ Ġprotected Ġfun Ġ< T Ġ: ĠAny > ĠProperty Provider < T >. nullable (): ĠProperty Provider < T ?> Ġ= ĊĠĠĠĠĠĠĠ Ġproperty ( Type . Nullable ( type ), Ġis Extension ) ĊĊĠĠĠ Ġ@ Js Name (" optional _ property ") ĊĠĠĠ Ġprotected Ġfun Ġ< T > ĠProperty Provider < T >. optional (): ĠProperty Provider < Option < T >> Ġ= ĊĠĠĠĠĠĠĠ Ġproperty ( Type . Optional ( type ), Ġis Extension ) ĊĊĠĠĠ Ġ@ Js Name (" list _ property ") ĊĠĠĠ Ġprotected Ġfun Ġ< T > Ġlist ( prop : ĠProperty Provider < T >): ĠProperty Provider < List < T >> Ġ= ĊĠĠĠĠĠĠĠ Ġproperty ( Type . ArrayType ( prop . type ), Ġprop . is Extension ) ĊĊĠĠĠ Ġ@ Js Name (" map _ property ") ĊĠĠĠ Ġprotected Ġfun Ġ< V > Ġmap ( value Prop : ĠProperty Provider < V >): ĠProperty Provider < Map < String , ĠV >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproperty ( Type . Map Type ( value Prop . type ), Ġvalue Prop . is Extension ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Js Name (" obj _ property ") ĊĠĠĠ Ġprotected Ġfun Ġ< T Ġ: ĠAny > Ġobj ( structure : ĠType Structure < T >, Ġis Extension : ĠBoolean Ġ= Ġfalse ): ĠProperty Provider < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproperty ( Type . ObjectType ( structure ), Ġis Extension ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Js Name (" enum _ property ") ĊĠĠĠ Ġprotected Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠEnum < T >> Ġenum ( is Extension : ĠBoolean Ġ= Ġfalse ): ĠProperty Provider < T > Ġ= Ġproperty ( Type . Enum Type (), Ġis Extension ) ĊĊĠĠĠ Ġ@ Js Name (" property _ provider ") ĊĠĠĠ Ġprotected Ġfun Ġ< T > Ġproperty ( type : ĠType < T >, Ġis Extension : ĠBoolean Ġ= Ġfalse ): ĠProperty Provider < T > Ġ= ĠProperty Provider ( type , Ġis Extension , Ġis Record ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproperties [ it . name ] Ġ= Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Js Name (" with _ className ") ĊĠĠĠ Ġprotected Ġfun ĠJson Value . with ClassName ( className : ĠString ): ĠJson Value Ġ= Ġalso Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . getField (" className ") Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [" className "] Ġ= Ġjson String ( className ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġminor Deserialization Error ( message : ĠString , Ġlink : ĠReference Chain Link ): ĠNothing Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠDeserial ization Exception . Minor ( message , Ġlink ) ĊĊĠĠĠ Ġpublic Ġclass ĠProperty < T > Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġtype : ĠType < T >, ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġinclusion Strategy : ĠIn clusion Strategy , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġpublic Ġenum Ġclass ĠIn clusion Strategy Ġ{ ĊĠĠĠĠĠĠĠ ĠONLY _ EX PL IC IT , ĊĠĠĠĠĠĠĠ ĠONLY _ EX PL IC IT _ OR _ PARENT _ EX PL IC IT , ĊĠĠĠĠĠĠĠ ĠP ARENT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġclass ĠProperty Provider < T > Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġtype : ĠType < T >, ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġis Extension : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġis Outer Record : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġregister : Ġ( Property < T >) Ġ-> ĠUnit , ĊĠĠĠ Ġ) Ġ: ĠProperty Delegate Provider < Type Structure <* >, ĠReadOnly Property < Type Structure <* >, ĠProperty < T >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġoperator Ġfun Ġprovide Delegate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ref : ĠType Structure <* >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty : ĠK Property <* >, ĊĠĠĠĠĠĠĠ Ġ): ĠReadOnly Property < Type Structure <* >, ĠProperty < T >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinclusion Strategy Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Extension Ġ-> ĠIn clusion Strategy . ONLY _ EX PL IC IT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Outer Record Ġ&& Ġproperty . name Ġ== Ġ" id " Ġ-> ĠIn clusion Strategy . ONLY _ EX PL IC IT _ OR _ PARENT _ EX PL IC IT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠIn clusion Strategy . PARENT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprop Ġ= ĠProperty ( property . name , Ġtype , Ġinclusion Strategy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister ( prop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠReadOnly Property Ġ{ Ġ_, Ġ_ Ġ-> Ġprop Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ