/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 2 , ĠVal ap he e . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . val ap he e . jackson . data format . nbt Ċ Ċ import Ġcom . fasterxml . jackson . core . Base 6 4 Variant Ċ import Ġcom . fasterxml . jackson . core . Json Token Ċ import Ġcom . fasterxml . jackson . core . Object Codec Ċ import Ġcom . fasterxml . jackson . core . Version Ċ import Ġcom . fasterxml . jackson . core . base . Parser Base Ċ import Ġcom . fasterxml . jackson . core . io . IO Context Ċ import Ġcom . fasterxml . jackson . core . json . Package Version Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . Data Input Ċ import Ġjava . io . EOF Exception Ċ import Ġjava . io . OutputStream Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . BigInteger Ċ Ċ /** Ċ Ġ* Ġ@ author ĠKevin ĠL ud w ig Ċ Ġ*/ Ċ open Ġclass ĠNbt Parser ( ĊĠĠĠ Ġcontext : ĠIO Context , ĊĠĠĠ Ġfeatures : ĠInt , ĊĠĠĠ Ġprotected Ġvar Ġ_ codec : ĠObject Codec , ĊĠĠĠ Ġprotected Ġval Ġ_ input : ĠData Input , ĊĠĠĠ Ġprotected Ġval Ġ_ format Features : ĠInt Ċ ) Ġ: ĠParser Base ( context , Ġfeatures ) Ġ{ ĊĠĠĠ Ġprotected Ġclass ĠContext ( ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠNbt Type , ĊĠĠĠĠĠĠĠ Ġvar Ġarray State : ĠInt Ġ= Ġ 1 ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprotected Ġvar Ġ_ contexts Ġ= Ġmutable ListOf < Context >(). apply Ġ{ Ġif Ġ( N bt Factory . Feature . No Wrap . enabled In (_ format Features )) Ġadd ( Context ( N bt Type . Compound )) Ġ} ĊĠĠĠ Ġprotected Ġvar Ġ_ object Start State Ġ= Ġfalse ĊĠĠĠ Ġprotected Ġvar Ġ_ object End State Ġ= Ġfalse ĊĊĠĠĠ Ġprotected Ġvar Ġ_ number Float Ġ= Ġ 0 . 0 f ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ* ĠCon struction , Ġconfiguration , Ġinitialization ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġget Codec () Ġ= Ġ_ codec ĊĊĠĠĠ Ġoverride Ġfun Ġset Codec ( codec : ĠObject Codec ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis ._ codec Ġ= Ġcodec ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ* ĠVersion ed ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġversion (): ĠVersion Ġ= ĠPackage Version . VERSION ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ* ĠPublic ĠAPI , Ġconfiguration ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġget Format Features () Ġ= Ġ_ format Features ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ* ĠPublic ĠAPI , Ġtraversal ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġnext Token () Ġ= Ġ_ nextToken (). also Ġ{ Ġ_ curr Token Ġ= Ġit Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ_ nextToken (): ĠJson Token Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ num Types Valid Ġ= ĠNR _ UNKNOWN ĊĠĠĠĠĠĠĠ Ġ_ binary Value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcurrent Value Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ(_ curr Token Ġ== Ġnull Ġ&& ĠNbt Factory . Feature . No Wrap . enabled In (_ format Features )) Ġreturn ĠJson Token . START _ OBJECT ĊĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġcompound s Ġto Ġwork Ġproperly , Ġmultiple Ġruns Ġare Ġneeded , Ġtherefore Ġa Ġstate Ġis Ġrequired . ĊĠĠĠĠĠĠĠ Ġif Ġ(!_ object Start State ) Ġwhen Ġ(_ contexts . last OrNull ()?. type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . Compound Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . values ()[ _ input . read Byte (). toInt ()] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠEOF Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . End ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠNbt Type . End ) Ġ_ object End State Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ contexts Ġ+= ĠContext ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠNbt Type . Compound ) Ġ_ object Start State Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparsing Context . current Name Ġ= Ġ_ input . read UTF () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJson Token . FIELD _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠNbt Type . values ()[ _ input . read Byte (). toInt ()] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠNbt Type . End ) Ġreturn ĠJson Token . VALUE _ NULL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ contexts Ġ+= ĠContext ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparsing Context . current Name Ġ= Ġ_ input . read UTF () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDec rement Ġtags , Ġand Ġremove Ġwhen Ġfinished . ĊĠĠĠĠĠĠĠ Ġ_ contexts . last OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . array State Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ contexts . remove Last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( it . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* N bt Type . ByteArray , Ġ*/ N bt Type . List /* , ĠNbt Type . IntArray , ĠNbt Type . Long Array */ Ġ-> ĠJson Token . END _ ARRAY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . Compound Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ object End State Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . END _ OBJECT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ_ nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġit . array State -- ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġa Ġlist Ġof Ġcompound s Ġis Ġpresent Ġthen Ġa Ġtag Ġshould Ġnot Ġonly Ġend Ġwhen Ġthere Ġare Ġno Ġelements Ġpresent Ġin Ġthe Ġlist . ĊĠĠĠĠĠĠĠ Ġif Ġ(_ object End State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ object End State Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJson Token . END _ OBJECT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( val Ġtype Ġ= Ġ_ contexts . last OrNull ()?. type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . Byte Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ num Types Valid Ġ= ĠNR _ INT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ_ input . read Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ number Int Ġ= Ġvalue . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ(_ number Int ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠJson Token . VALUE _ FALSE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠJson Token . VALUE _ TRUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠJson Token . /* VALUE _ NUMBER _ INT */ VALUE _ EMB ED DED _ OBJECT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . Short Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ num Types Valid Ġ= ĠNR _ INT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ_ input . read Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ number Int Ġ= Ġvalue . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . /* VALUE _ NUMBER _ INT */ VALUE _ EMB ED DED _ OBJECT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . Int Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ num Types Valid Ġ= ĠNR _ INT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ number Int Ġ= Ġ_ input . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ NUMBER _ INT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . Long Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ num Types Valid Ġ= ĠNR _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ number Long Ġ= Ġ_ input . read Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ NUMBER _ INT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . Float Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ num Types Valid Ġ= ĠNR _ FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ number Float Ġ= Ġ_ input . read Float () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ NUMBER _ FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . Double Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ num Types Valid Ġ= ĠNR _ DOUBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ number Double Ġ= Ġ_ input . read Double () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ NUMBER _ FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . ByteArray Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* _ contexts Ġ+= ĠContext ( N bt Type . Byte , Ġ_ input . readInt ()) */ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ binary Value Ġ= ĠByteArray (_ input . readInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ input . read Fully (_ binary Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Value Ġ= Ġ_ binary Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ EMB ED DED _ OBJECT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . String Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Value Ġ= Ġ_ input . read UTF () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ STRING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . List Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Type Ġ= ĠNbt Type . values ()[ _ input . read Byte (). toInt ()] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġ_ input . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Type Ġ== ĠNbt Type . Compound ) Ġ_ object Start State Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ contexts Ġ+= ĠContext ( list Type , Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . START _ ARRAY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . Compound Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ object Start State Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . START _ OBJECT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . IntArray Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* _ contexts Ġ+= ĠContext ( N bt Type . Int , Ġ_ input . readInt ()) */ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Value Ġ= ĠInt Array (_ input . readInt ()) Ġ{ Ġ_ input . readInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . /* START _ ARRAY */ VALUE _ EMB ED DED _ OBJECT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNbt Type . Long Array Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* _ contexts Ġ+= ĠContext ( N bt Type . Long , Ġ_ input . readInt ()) */ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Value Ġ= ĠLong Array (_ input . readInt ()) Ġ{ Ġ_ input . read Long () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . /* START _ ARRAY */ VALUE _ EMB ED DED _ OBJECT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO ("$ type ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ* ĠPublic ĠAPI , Ġaccess Ġto Ġtoken Ġinformation , Ġtext ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun ĠgetText () Ġ= Ġwhen Ġ(_ curr Token ) Ġ{ ĊĠĠĠĠĠĠĠ ĠJson Token . FIELD _ NAME Ġ-> Ġcurrent Name ĊĠĠĠĠĠĠĠ ĠJson Token . VALUE _ NUMBER _ INT , ĠJson Token . VALUE _ NUMBER _ FLOAT Ġ-> Ġnumber Value . toString () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcurrent Value ?. toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetText Characters () Ġ= Ġtext ?. toCharArray () ĊĊĠĠĠ Ġoverride Ġfun ĠgetText Length () Ġ= Ġtext ?. length Ġ?: Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun ĠgetText Offset () Ġ= Ġ 0 ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ* ĠNumeric Ġaccessors Ġof Ġpublic ĠAPI ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġis NaN (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(_ curr Token Ġ== ĠJson Token . VALUE _ NUMBER _ FLOAT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ DOUBLE Ġ!= Ġ 0 ) Ġ_ number Double . isNaN () Ġ|| Ġ_ number Double . isIn finite () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(_ num Types Valid Ġand ĠNR _ FLOAT Ġ!= Ġ 0 ) Ġ_ number Float . isNaN () Ġ|| Ġ_ number Float . isIn finite () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġfalse ĊĠĠĠĠĠĠĠ Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Number Value (): ĠNumber Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġ== ĠNR _ UNKNOWN ) Ġ_ check Numeric Value ( NR _ UNKNOWN ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(_ curr Token Ġ== ĠJson Token . VALUE _ NUMBER _ INT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ INT Ġ!= Ġ 0 ) Ġ_ number Int ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(_ num Types Valid Ġand ĠNR _ LONG Ġ!= Ġ 0 ) Ġ_ number Long ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(_ num Types Valid Ġand ĠNR _ BIG INT Ġ!= Ġ 0 ) Ġ_ number BigInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ_ number BigDecimal ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ(_ num Types Valid Ġand ĠNR _ BIG DECIMAL Ġ!= Ġ 0 ) Ġ_ number BigDecimal ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ(_ num Types Valid Ġand ĠNR _ DOUBLE Ġ!= Ġ 0 ) Ġ_ number Double ĊĠĠĠĠĠĠĠ Ġelse Ġ_ number Float ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Number Value Exact () Ġ= Ġnumber Value ĊĊĠĠĠ Ġoverride Ġfun Ġget Number Type (): ĠNumber Type Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġ== ĠNR _ UNKNOWN ) Ġ_ check Numeric Value ( NR _ UNKNOWN ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(_ curr Token Ġ== ĠJson Token . VALUE _ NUMBER _ INT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ INT Ġ!= Ġ 0 ) ĠNumber Type . INT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(_ num Types Valid Ġand ĠNR _ LONG Ġ!= Ġ 0 ) ĠNumber Type . LONG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠNumber Type . BIG _ INTEGER ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ(_ num Types Valid Ġand ĠNR _ BIG DECIMAL Ġ!= Ġ 0 ) ĠNumber Type . BIG _ DECIMAL ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ(_ num Types Valid Ġand ĠNR _ DOUBLE Ġ!= Ġ 0 ) ĠNumber Type . DOUBLE ĊĠĠĠĠĠĠĠ Ġelse ĠNumber Type . FLOAT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Int Value (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ INT Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġ== ĠNR _ UNKNOWN ) Ġ_ check Numeric Value ( NR _ INT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ INT Ġ== Ġ 0 ) Ġconvert Number ToInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ number Int ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Long Value (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ LONG Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġ== ĠNR _ UNKNOWN ) Ġ_ check Numeric Value ( NR _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ LONG Ġ== Ġ 0 ) Ġconvert Number To Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ number Long ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget BigInteger Value (): ĠBigInteger ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ BIG INT Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġ== ĠNR _ UNKNOWN ) Ġ_ check Numeric Value ( NR _ BIG INT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ BIG INT Ġ== Ġ 0 ) Ġconvert Number To BigInteger () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ number BigInt ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Float Value (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ FLOAT Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġ== ĠNR _ UNKNOWN ) Ġ_ check Numeric Value ( NR _ FLOAT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ FLOAT Ġ== Ġ 0 ) Ġconvert Number To Float () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ number Float ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Double Value (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ DOUBLE Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġ== ĠNR _ UNKNOWN ) Ġ_ check Numeric Value ( NR _ DOUBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ DOUBLE Ġ== Ġ 0 ) Ġconvert Number ToDouble () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ number Double ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Decimal Value (): ĠBigDecimal ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ BIG DECIMAL Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġ== ĠNR _ UNKNOWN ) Ġ_ check Numeric Value ( NR _ BIG DECIMAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ BIG DECIMAL Ġ== Ġ 0 ) Ġconvert Number To BigDecimal () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ number BigDecimal ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ* ĠNumeric Ġconversions ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġprivate Ġfun Ġ_ check Numeric Value ( exp Type : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ curr Token Ġ== ĠJson Token . VALUE _ NUMBER _ INT Ġ|| Ġ_ curr Token Ġ== ĠJson Token . VALUE _ NUMBER _ FLOAT ) Ġreturn ĊĠĠĠĠĠĠĠ Ġ_ report Error (" Current Ġtoken Ġ(${ current Token () }) Ġnot Ġnumeric , Ġcan Ġnot Ġuse Ġnumeric Ġvalue Ġaccessors ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Number To Float () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ num Types Valid Ġand ĠNR _ BIG DECIMAL Ġ!= Ġ 0 ) Ġ_ number Float Ġ= Ġ_ number BigDecimal . toFloat () ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ(_ num Types Valid Ġand ĠNR _ BIG INT Ġ!= Ġ 0 ) Ġ_ number Float Ġ= Ġ_ number BigInt . toFloat () ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ(_ num Types Valid Ġand ĠNR _ DOUBLE Ġ!= Ġ 0 ) Ġ_ number Float Ġ= Ġ_ number Double . toFloat () ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ(_ num Types Valid Ġand ĠNR _ LONG Ġ!= Ġ 0 ) Ġ_ number Float Ġ= Ġ_ number Long . toFloat () ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ(_ num Types Valid Ġand ĠNR _ INT Ġ!= Ġ 0 ) Ġ_ number Float Ġ= Ġ_ number Int . toFloat () ĊĠĠĠĠĠĠĠ Ġelse Ġ_ throw Internal () ĊĠĠĠĠĠĠĠ Ġ_ num Types Valid Ġ= Ġ_ num Types Valid Ġor ĠNR _ FLOAT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ* ĠPublic ĠAPI , Ġaccess Ġto Ġtoken Ġinformation , Ġbinary ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġget Binary Value ( variant : ĠBase 6 4 Variant ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ curr Token Ġ!= ĠJson Token . VALUE _ EMB ED DED _ OBJECT ) Ġ_ report Error (" Current Ġtoken Ġ($_ curr Token ) Ġnot ĠVALUE _ EMB ED DED _ OBJECT , Ġcan Ġnot Ġaccess Ġas Ġbinary ") ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ binary Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Embedded Object () Ġ= Ġif Ġ(_ curr Token Ġ== ĠJson Token . VALUE _ EMB ED DED _ OBJECT ) Ġcurrent Value Ġelse Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġread Binary Value ( variant : ĠBase 6 4 Variant , Ġstream : ĠOutputStream ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ curr Token Ġ!= ĠJson Token . VALUE _ EMB ED DED _ OBJECT ) Ġ_ report Error (" Current Ġtoken Ġ($_ curr Token ) Ġnot ĠVALUE _ EMB ED DED _ OBJECT , Ġcan Ġnot Ġaccess Ġas Ġbinary ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ_ binary Value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġ_ binary Value . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write (_ binary Value , Ġ 0 , Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlength ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ* ĠAbstract Ġmethods Ġfor Ġsub - classes Ġto Ġimplement ĊĠĠĠĠ Ġ********************************************************* * ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġ_ close Input () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ input Ġis ĠClose able ) Ġ_ input . close () ĊĠĠĠ Ġ} Ċ } Ċ