/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠO liver ĠB erg Ċ Ġ* Ċ Ġ* Ġ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 Ġnet . orm r . semver 4 k Ċ Ċ import Ġkotlinx . collections . immutable . Persistent List Ċ import Ġkotlinx . collections . immutable . persistent ListOf Ċ import Ġnet . orm r . semver 4 k . Sem Ver ParseException .* Ċ import Ġnet . orm r . semver 4 k . Sem Ver Parser . Matcher .* Ċ Ċ internal Ġclass ĠSem Ver Parser ( private Ġval Ġsource : ĠString ) Ġ{ ĊĠĠĠ Ġinternal Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNULL Ġ= Ġ'\ u 0 0 0 0 ' ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse Sem Ver ( source : ĠString ): ĠResult < Sem Ver > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠSem Ver Parser ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkotlin . run Catch ing Ġ{ Ġparser . sem Ver () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse Identifier Sequence ( source : ĠString ): ĠResult < Persistent List < Identifier >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠSem Ver Parser ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkotlin . run Catch ing Ġ{ Ġparser . identifier Sequence ( null ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse Identifier ( source : ĠString ): ĠResult < Identifier > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠSem Ver Parser ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkotlin . run Catch ing Ġ{ Ġparser . identifier () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcursor Start Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcursor Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun Ġsem Ver (): ĠSem Ver Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmajor Ġ= Ġversion Core (" major ") ĊĠĠĠĠĠĠĠ Ġconsume ( DOT , Ġ" Expect Ġ'.' Ġafter Ġmajor Ġversion ") ĊĠĠĠĠĠĠĠ Ġval Ġminor Ġ= Ġversion Core (" minor ") ĊĠĠĠĠĠĠĠ Ġconsume ( DOT , Ġ" Expect Ġ'.' Ġafter Ġminor Ġversion ") ĊĠĠĠĠĠĠĠ Ġval Ġpatch Ġ= Ġversion Core (" patch ") ĊĠĠĠĠĠĠĠ Ġval Ġpre Release Ġ= Ġif Ġ( match ( HY P HEN )) Ġidentifier Sequence ("- ") Ġelse Ġpersistent ListOf () ĊĠĠĠĠĠĠĠ Ġval Ġbuild Metadata Ġ= Ġif Ġ( match ( PLUS )) Ġidentifier Sequence ("+ ") Ġelse Ġpersistent ListOf () ĊĠĠĠĠĠĠĠ Ġconsume ( END _ OF _ INPUT , Ġ" Expected Ġend Ġof Ġinput ") ĊĠĠĠĠĠĠĠ Ġreturn ĠSem Ver ( major , Ġminor , Ġpatch , Ġpre Release , Ġbuild Metadata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġversion Core ( name : ĠString ): ĠUInt Ġ{ ĊĠĠĠĠĠĠĠ Ġsync Cursor () ĊĊĠĠĠĠĠĠĠ Ġconsume ( NUMBER , Ġ" Expected Ġ$ name Ġversion ") ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( peek Match ( NUMBER )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadvance () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠgetCurrent Text () ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . to UInt () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Number ("' $ text ' Ġis Ġnot Ġa Ġvalid Ġnumber .", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġidentifier Sequence ( symbol : ĠString ?): ĠPersistent List < Identifier > Ġ= Ġbuild Persistent List Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! peek Match ( NUMBER , ĠLETTER , ĠH YP HEN )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpre Message Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol ?. let Ġ{ Ġ" Expected Ġidentifier Ġafter Ġ'$ it '" Ġ} Ġ?: Ġ" Expected Ġidentifier Ġat Ġstart Ġof Ġsequence " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is At End ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnexpected EndOf Input ("$ pre Message , Ġgot Ġend Ġof Ġinput .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnexpected Character ("$ pre Message , Ġgot Ġ'${ peek ()} '. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( identifier ()) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( match ( DOT )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġidentifier (): ĠIdentifier Ġ{ ĊĠĠĠĠĠĠĠ Ġsync Cursor () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is At End ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnexpected EndOf Input (" Expected Ġidentifier , Ġgot Ġend Ġof Ġinput .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( peek Match ( NUMBER , ĠLETTER , ĠH YP HEN )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadvance () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠgetCurrent Text () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . isNumber () Ġ-> ĠIdentifier . Numeric ( text . to UL ong ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠIdentifier . Al phanumeric ( text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconsume ( matcher : ĠMatcher , Ġmessage : ĠString ): ĠChar Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġis At End () Ġ-> Ġif Ġ( matcher Ġ== ĠEND _ OF _ INPUT ) ĠNULL Ġelse Ġthrow ĠUnexpected EndOf Input ("$ message , Ġgot Ġend Ġof Ġinput .") ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar Ġ= Ġadvance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher . is Match ( char ) Ġ-> Ġchar ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnexpected Character ("$ message , Ġgot Ġ'$ char '. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpeek Match ( matcher : ĠMatcher ): ĠBoolean Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġis At End () Ġ-> Ġmatcher Ġ== ĠEND _ OF _ INPUT ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmatcher . is Match ( peek ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpeek Match ( var arg Ġmatch ers : ĠMatcher ): ĠBoolean Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġis At End () Ġ-> Ġmatch ers . any Ġ{ Ġit Ġ== ĠEND _ OF _ INPUT Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpeek Ġ= Ġpeek () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatch ers . any Ġ{ Ġit . is Match ( peek ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmatch ( matcher : ĠMatcher ): ĠBoolean Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġis At End () Ġ-> Ġmatcher Ġ== ĠEND _ OF _ INPUT ĊĠĠĠĠĠĠĠ Ġ! matcher . is Match ( peek ()) Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadvance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadvance (): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġcursor ++ ĊĠĠĠĠĠĠĠ Ġreturn Ġsource [ cursor Ġ- Ġ 1 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpeek (): ĠChar Ġ= Ġif Ġ( is At End ()) Ġ'\ u 0 0 0 0 ' Ġelse Ġsource [ cursor ] ĊĊĠĠĠ Ġprivate Ġfun Ġis At End (): ĠBoolean Ġ= Ġcursor Ġ>= Ġsource . length ĊĊĠĠĠ Ġprivate Ġfun Ġhas More (): ĠBoolean Ġ= Ġ! is At End () ĊĊĠĠĠ Ġprivate Ġfun ĠgetCurrent Text (): ĠString Ġ= Ġsource . substring ( cursor Start , Ġcursor ) ĊĊĠĠĠ Ġprivate Ġfun Ġsync Cursor () Ġ{ ĊĠĠĠĠĠĠĠ Ġcursor Start Ġ= Ġcursor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠMatcher ( val Ġsymbol : ĠString , Ġprivate Ġval Ġmatcher : Ġ( Char ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠNUMBER ("[ 0 - 9 ]", Ġ{ Ġit Ġin Ġ' 0 ' .. ' 9 ' Ġ}), ĊĠĠĠĠĠĠĠ ĠLETTER ("[ A - Za - z ]", Ġ{ Ġit Ġin Ġ' A ' .. ' Z ' Ġ|| Ġit Ġin Ġ' a ' .. ' z ' Ġ}), ĊĠĠĠĠĠĠĠ ĠDOT (".", Ġ{ Ġit Ġ== Ġ'.' Ġ}), ĊĠĠĠĠĠĠĠ ĠH YP HEN ("- ", Ġ{ Ġit Ġ== Ġ'-' Ġ}), ĊĠĠĠĠĠĠĠ ĠPL US ("+ ", Ġ{ Ġit Ġ== Ġ'+' Ġ}), ĊĠĠĠĠĠĠĠ ĠEND _ OF _ INPUT (" end Ġof Ġinput ", Ġ{ Ġit Ġ== ĠNULL Ġ}); ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Match ( char : ĠChar ): ĠBoolean Ġ= Ġmatcher ( char ) ĊĠĠĠ Ġ} Ċ }