/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 . ĠP ela ĠC rist ian Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" FunctionName ") Ċ Ċ package Ġp cf . cr sk dev . in val . id Ċ Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . BigInteger Ċ import Ġjava . math . Math Context Ċ import Ġjava . math . Round ingMode Ċ import Ġjava . nio . charset . Coding ErrorAction . IGNORE Ċ import Ġjava . util . Date Ċ import Ġkotlin . math . abs Ċ Ċ /** Ċ Ġ* ĠBuilt - in Ġvalidation Ġrules Ġoffered Ġby Ġin val - id Ġthat Ċ Ġ* Ġloose ly Ġfollow Ġ[ javax . validation . constraints ]( https :// java ee . github . io / java ee - spec / javadoc s / javax / validation / constraints / package - frame . html ) Ċ Ġ* Ċ Ġ*/ Ċ object ĠRules Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġfalse . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage ĠMessage . ĊĠĠĠĠ Ġ* Ġ@ return ĠValidation < Boolean > ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠAssert True ( message : ĠString Ġ= Ġ" Boolean Ġflag Ġmust Ġbe Ġtrue "): ĠValidation < Boolean > Ġ= ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠ Ġerror On Fail ( message ) Ġ{ Ġ! input Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġfalse . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage ĠMessage . ĊĠĠĠĠ Ġ* Ġ@ return ĠValidation < Boolean > ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠAssert False ( message : ĠString Ġ= Ġ" Boolean Ġflag Ġmust Ġbe Ġfalse "): ĠValidation < Boolean > Ġ= ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠ Ġerror On Fail ( message ) Ġ{ Ġinput Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġcontain Ġat Ġleast Ġone Ġnon - white Ġspace Ġcharacter . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage ĠMessage . ĊĠĠĠĠ Ġ* Ġ@ return ĠValidation < CharSequence > ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠNot Blank ( message : ĠString Ġ= Ġ" Field Ġor Ġproperty Ġrequired "): ĠValidation < CharSequence > Ġ= ĊĠĠĠĠĠĠĠ ĠValidation Ġ{ Ġinput Ġ-> Ġerror On Fail ( message ) Ġ{ Ġinput . isBlank () Ġ} Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġnot Ġbe Ġempty . ĊĠĠĠĠ Ġ* ĠThe Ġlength Ġof Ġthe Ġcharacters Ġor Ġarray , Ġand Ġthe Ġsize Ġof Ġa Ġcollection Ġor Ġmap Ġare Ġevaluated . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSupported Ġtypes Ġare : ĊĠĠĠĠ Ġ* Ġ- ĠCharSequence Ġ( length Ġof Ġcharacter Ġsequence Ġis Ġevaluated ) ĊĠĠĠĠ Ġ* Ġ- ĠCollection Ġ( collection Ġsize Ġis Ġevaluated ) ĊĠĠĠĠ Ġ* Ġ- ĠMap Ġ( map Ġsize Ġis Ġevaluated ) ĊĠĠĠĠ Ġ* Ġ- ĠArray Ġ( array Ġlength Ġis Ġevaluated ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage ĠMessage . ĊĠĠĠĠ Ġ* Ġ@ return ĠValidation < CharSequence > ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > ĠNot Empty ( message : ĠString Ġ= Ġ" Field Ġor Ġproperty Ġrequired "): ĠValidation < T > Ġ= ĊĠĠĠĠĠĠĠ ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror On Fail ( message ) Ġ{ Ġsize Of ( input ) Ġ== Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġa Ġ[ Number ] Ġvalue Ġlower Ġthan Ġor Ġequal ĊĠĠĠĠ Ġ* Ġto Ġthe Ġ[ Number ] Ġin Ġthe Ġvalue Ġelement . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠReturns Ġ_( Number ) Ġ-> ĠValidation < Number >_ Ġlambda , Ġwhere Ġargument Ġis Ġthe Ġmax Ġnumber Ġagainst Ġwhich ĊĠĠĠĠ Ġ* Ġinput Ġwill Ġbe Ġtested . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠExample : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ_ Max ( scale Ġ= Ġ 2 . scale ()) ( 1 0 . 1 2 f ) Ġvalidates Ġ 1 0 . 1 1 8 6 5 4 f Ġwith Id Ġ 1 _ ĊĠĠĠĠ Ġ* Ġ( suc ceeds Ġbecause Ġinput Ġ_ 1 0 . 1 1 8 6 5 4 f _ Ġis Ġrounded Ġup Ġto Ġ_ 1 0 . 1 2 f _, Ġthe Ġmax Ġallowed ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ_ Max ()( 1 0 ) Ġvalidates Ġ 1 9 Ġwith Id Ġ 1 _ Ġ( fails Ġbecause Ġmin Ġis Ġ_ 1 0 _ Ġand Ġinput Ġis Ġ_ 1 9 _) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠCustom Ġmessage Ġlambda . ĠTakes Ġthe Ġinput Ġand Ġmax Ġas Ġargs . ĊĠĠĠĠ Ġ* Ġ@ param Ġscale Ġ[ Scale ] Ġapproximation Ġscale Ġapplicable Ġfor Ġfloats Ġand Ġdouble s Ġinputs Ġdecimal Ġscale . ĊĠĠĠĠ Ġ* Ġotherwise Ġfor Ġintegers Ġwill Ġbe Ġignored . ĊĠĠĠĠ Ġ* Ġ@ return Ġ( T ) Ġ-> ĠValidation < T >. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠMax ( ĊĠĠĠĠĠĠĠ Ġscale : ĠScale Ġ= ĠScale (), ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( Number , ĠNumber ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġmax Ġ-> Ġ" Input Ġ$ input Ġmust Ġbe Ġat Ġmost Ġ$ max ." Ġ} ĊĠĠĠ Ġ): Ġ( Number ) Ġ-> ĠValidation < Number > Ġ= Ġ{ Ġmax Ġ-> ĊĠĠĠĠĠĠĠ ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpredicate : Ġ( Number ) Ġ-> ĠBoolean Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to BigDecimal Internal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Scale ( scale . value , Ġscale . rounding Mode ) Ġ> Ġmax . to BigDecimal Internal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Scale ( scale . value , Ġscale . rounding Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror On Fail ( message Provider ( input , Ġmax ), Ġpredicate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġa Ġ[ Number ] Ġvalue Ġlarger Ġthan Ġor Ġequal ĊĠĠĠĠ Ġ* Ġto Ġthe Ġ[ Number ] Ġin Ġthe Ġvalue Ġelement . ĊĠĠĠĠ Ġ* ĠReturns Ġ_( Number ) Ġ-> ĠValidation < Number >_ Ġlambda , Ġwhere Ġarg Ġis Ġthe Ġminimum Ġnumber Ġagainst Ġwhich ĊĠĠĠĠ Ġ* Ġinput Ġwill Ġbe Ġtested . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠExample : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ_ Min ( scale Ġ= Ġ 2 . scale ()) ( 1 0 . 1 2 f ) Ġvalidates Ġ 1 0 . 1 1 8 6 5 4 f Ġwith Id Ġ 1 _ ĊĠĠĠĠ Ġ* Ġ( suc ceeds Ġbecause Ġinput Ġ_ 1 0 . 1 1 8 6 5 4 f _ Ġis Ġrounded Ġup Ġto Ġ_ 1 0 . 1 2 f _, Ġthe Ġmin Ġallowed ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ_ Min ()( 1 0 ) Ġvalidates Ġ 9 Ġwith Id Ġ 1 _ Ġ( fails Ġbecause Ġmin Ġis Ġ_ 1 0 _ Ġand Ġinput Ġis Ġ_ 9 _) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠCustom Ġmessage Ġlambda . ĠTakes Ġthe Ġinput Ġand Ġmin Ġas Ġargs . ĊĠĠĠĠ Ġ* Ġ@ param Ġscale Ġ[ Math Context ] Ġapproximation Ġscale Ġapplicable Ġfor Ġfloats Ġand Ġdouble s Ġinputs Ġdecimal Ġscale , ĊĠĠĠĠ Ġ* Ġotherwise Ġfor Ġintegers Ġwill Ġbe Ġignored . ĊĠĠĠĠ Ġ* Ġ@ return Ġ( Number ) Ġ-> ĠValidation < Number >. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠMin ( ĊĠĠĠĠĠĠĠ Ġscale : ĠScale Ġ= ĠScale (), ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( Number , ĠNumber ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġmin Ġ-> Ġ" Input Ġ$ input Ġmust Ġbe Ġat Ġleast Ġ$ min ." Ġ} ĊĠĠĠ Ġ): Ġ( Number ) Ġ-> ĠValidation < Number > Ġ= Ġ{ Ġmin Ġ-> ĊĠĠĠĠĠĠĠ ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpredicate : Ġ( Number ) Ġ-> ĠBoolean Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to BigDecimal Internal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Scale ( scale . value , Ġscale . rounding Mode ) Ġ< Ġmin . to BigDecimal Internal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Scale ( scale . value , Ġscale . rounding Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror On Fail ( message Provider ( input , Ġmin ), Ġpredicate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInterval ĠRule , Ġthat Ġuses Ġinternally Ġ[ Min ] Ġand Ġ[ Max ] Ġrules . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġon Ġfail . ĠLambda Ġtake ĠInput , ĠMin Ġand ĠMax Ġvalues Ġas Ġargs . ĊĠĠĠĠ Ġ* Ġ@ param Ġscale ĠDecimal Ġscale Ġscaling . ĠSee Ġ[ Min ] Ġand Ġ[ Max ] ĊĠĠĠĠ Ġ* Ġ@ return ĠLambda Ġthat Ġtakes Ġ[ Min ] ĠNumber Ġand Ġ[ Max ] ĠNumber Ġas Ġparams Ġand Ġreturns Ġa ĠValidation < Number >. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠMin Max ( ĊĠĠĠĠĠĠĠ Ġscale : ĠScale Ġ= ĠScale (), ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( Number , ĠNumber , ĠNumber ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġmin , Ġmax Ġ-> Ġ"$ input Ġmust Ġbe Ġbetween Ġ[$ min , Ġ$ max ]" Ġ} ĊĠĠĠ Ġ): Ġ( Number , ĠNumber ) Ġ-> ĠValidation < Number > Ġ= Ġ{ Ġmin , Ġmax Ġ-> ĊĠĠĠĠĠĠĠ ĠComp osed Validation ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMin ( scale ) Ġ{ Ġinput , Ġ_ Ġ-> Ġmessage Provider ( input , Ġmin , Ġmax ) Ġ} ( min ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMax ( scale ) Ġ{ Ġinput , Ġ_ Ġ-> Ġmessage Provider ( input , Ġmin , Ġmax ) Ġ} ( max ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġa Ġnumber Ġwithin Ġa Ġspecified Ġrange . ĠThe Ġinteger Ġelement Ġspecifies ĊĠĠĠĠ Ġ* Ġthe Ġmaximum Ġintegral Ġdigits Ġfor Ġthe Ġnumber , Ġand Ġthe Ġfraction Ġelement Ġspecifies Ġthe Ġmaximum Ġfraction al ĊĠĠĠĠ Ġ* Ġdigits Ġfor Ġthe Ġnumber . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠExample : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ_ Digits ()( 3 , Ġ 2 ) Ġvalidates Ġ 1 2 0 . 3 2 Ġwith Id Ġ 1 _ Ġpasses ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ_ Digits ()( 3 , Ġ 2 ) Ġvalidates Ġ 1 2 . 3 2 Ġwith Id Ġ 1 _ Ġfails ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġalso Ġ: Ġ[ Digits Int ], Ġ[ Digits Str ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġprovider Ġon Ġfail . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes ĠInput , ĠDig its Ġand ĠFr actions Ġas Ġargs Ġand Ġreturns Ġthe Ġmessage . ĊĠĠĠĠ Ġ* Ġ@ return Ġ`( Int , ĠInt ) Ġ-> ĠValidation < Number >` Ġthat Ġtakes ĠDig its Ġand ĠFr actions Ġas Ġargs . ĠOne Ġof Ġthem , ĊĠĠĠĠ Ġ* Ġ Ġbut Ġnot Ġboth , Ġcould Ġbe Ġignored Ġby Ġusing Ġ[ IGNORE ] Ġvalue Ġflag . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠDig its ( ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( Number , ĠInt , ĠInt ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġintegers , Ġfr actions Ġ-> Ġ"$ input Ġnumber Ġmust Ġhave Ġ$ inte gers Ġdigits Ġand Ġ$ fr actions Ġfr actions " Ġ} ĊĠĠĠ Ġ): Ġ( Int , ĠInt ) Ġ-> ĠValidation < Number > Ġ= Ġ{ Ġintegers , Ġfr actions Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( inte gers Ġ== ĠIG NORE Ġ&& Ġfr actions Ġ== ĠIG NORE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Can 't Ġignore Ġboth ĠIn te gers Ġand ĠFr actions .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror On Fail ( message Provider ( input , Ġintegers , Ġfr actions )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Bd Ġ= Ġinput . to BigDecimal Internal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( inte gers Ġ!= ĠIG NORE Ġ&& Ġabs ( input Bd . precision () Ġ- Ġinput Bd . scale ()) Ġ!= Ġintegers ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( fr actions Ġ!= ĠIG NORE Ġ&& Ġinput Bd . scale () Ġ!= Ġfr actions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġa Ġnumber Ġwithin Ġa Ġspecified Ġrange . ĠThe Ġinteger Ġelement Ġspecifies ĊĠĠĠĠ Ġ* Ġthe Ġmaximum Ġintegral Ġdigits Ġfor Ġthe Ġnumber , Ġand Ġthe Ġfraction Ġelement Ġspecifies Ġthe Ġmaximum Ġfraction al ĊĠĠĠĠ Ġ* Ġdigits Ġfor Ġthe Ġnumber . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt Ġassumes Ġthat Ġthat Ġthe Ġstring Ġinput Ġis Ġa Ġnumber Ġrepresentation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġrule Ġis Ġuseful Ġwhen Ġit Ġapplies Ġto Ġnumbers Ġthat Ġneed Ġto Ġretain Ġthe Ġfraction al Ġtrailing Ġzeros . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠExample : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ_ Digits Str ()( 3 , Ġ 2 ) Ġvalidates Ġ" 1 2 0 . 3 0 " Ġwith Id Ġ 1 _ Ġpasses ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġbut ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ_ Digits < Double >() ( 3 , Ġ 2 ) Ġvalidates Ġ 1 2 0 . 3 0 Ġwith Id Ġ 1 _ Ġfails Ġbecause Ġthe Ġtrailing Ġzero Ġis Ġignored Ġand Ġis Ġinterpreted ĊĠĠĠĠ Ġ* Ġas Ġhaving Ġone Ġdecimal . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġalso Ġ: Ġ[ Digits ], Ġ Ġ[ Digits Int ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġprovider Ġon Ġfail . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes ĠInput , ĠDig its Ġand ĠFr actions Ġas Ġargs Ġand Ġreturns Ġthe Ġmessage . ĊĠĠĠĠ Ġ* Ġ@ return Ġ`( Int , ĠInt ) Ġ-> ĠValidation ` Ġthat Ġtakes ĠDig its Ġand ĠFr actions Ġas Ġargs . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠDig its Str ( ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( String , ĠInt , ĠInt ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġintegers , Ġfr actions Ġ-> Ġ"$ input Ġnumber Ġmust Ġhave Ġ$ inte gers Ġdigits Ġand Ġ$ fr actions Ġfr actions " Ġ} ĊĠĠĠ Ġ): Ġ( Int , ĠInt ) Ġ-> ĠValidation < String > Ġ= Ġ{ Ġintegers , Ġfr actions Ġ-> ĊĠĠĠĠĠĠĠ ĠDig its Ġ{ Ġinput , Ġ_, Ġ_ Ġ-> Ġmessage Provider ( input . toString (), Ġintegers , Ġfr actions ) Ġ} ( inte gers , Ġfr actions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. adapt Ġ{ ĠBigDecimal ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvenience Ġfor Ġ` Digits < Int >( digits , Ġ 0 )`. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġan Ġint Ġnumber Ġwithin Ġa Ġspecified Ġrange . ĠThe Ġinteger Ġelement Ġspecifies ĊĠĠĠĠ Ġ* Ġthe Ġmaximum Ġintegral Ġdigits Ġfor Ġthe Ġnumber . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠExample : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ_ Digits Int ()( 3 ) Ġvalidates Ġ 1 2 0 Ġwith Id Ġ 1 _ Ġpasses ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ_ Digits Int ()( 3 ) Ġvalidates Ġ 1 2 Ġwith Id Ġ 1 _ Ġfails ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġprovider Ġon Ġfail . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes ĠInput Ġand ĠDig its Ġas Ġargs Ġand Ġreturns Ġthe Ġmessage . ĊĠĠĠĠ Ġ* Ġ@ return Ġ`( Int ) Ġ-> ĠValidation ` Ġthat Ġtakes ĠDig its Ġas Ġarg . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠDig its Int ( ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( Int , ĠInt ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġintegers Ġ-> Ġ"$ input Ġnumber Ġmust Ġhave Ġ$ inte gers Ġdigits " Ġ} ĊĠĠĠ Ġ): Ġ( Int ) Ġ-> ĠValidation < Int > Ġ= Ġ{ Ġintegers Ġ-> ĊĠĠĠĠĠĠĠ ĠDig its Ġ{ Ġinput , Ġ_, Ġ_ Ġ-> Ġmessage Provider ( input . toInt (), Ġintegers ) Ġ} ( inte gers , Ġ 0 ). adapt Ġ{ Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpecial ized Ġ[ Digits ] ĠRule Ġthat Ġignores Ġthe Ġ" fr actions " Ġpart . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġprovider Ġon Ġfail . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes ĠInput Ġand ĠDig its Ġas Ġargs Ġand Ġreturns Ġthe Ġmessage . ĊĠĠĠĠ Ġ* Ġ@ return Ġ`( Int ) Ġ-> ĠValidation ` Ġthat Ġtakes ĠDig its Ġas Ġarg . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠIn te gers ( ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( Number , ĠInt ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġintegers Ġ-> Ġ"$ input Ġnumber Ġmust Ġhave Ġ$ inte gers Ġintegers " Ġ} ĊĠĠĠ Ġ): Ġ( Int ) Ġ-> ĠValidation < Number > Ġ= Ġ{ Ġintegers Ġ-> ĊĠĠĠĠĠĠĠ ĠDig its Ġ{ Ġinput , Ġ_, Ġ_ Ġ-> Ġmessage Provider ( input , Ġintegers ) Ġ} ( inte gers , ĠIG NORE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpecial ized Ġ[ Digits Str ] ĠRule Ġthat Ġignores Ġthe Ġ" fr actions " Ġpart . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġprovider Ġon Ġfail . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes ĠInput Ġand ĠDig its Ġas Ġargs Ġand Ġreturns Ġthe Ġmessage . ĊĠĠĠĠ Ġ* Ġ@ return Ġ`( String ) Ġ-> ĠValidation ` Ġthat Ġtakes ĠDig its Ġas Ġarg . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠIn te gers Str ( ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( String , ĠInt ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġintegers Ġ-> Ġ"$ input Ġnumber Ġmust Ġhave Ġ$ inte gers Ġintegers " Ġ} ĊĠĠĠ Ġ): Ġ( Int ) Ġ-> ĠValidation < String > Ġ= Ġ{ Ġintegers Ġ-> ĊĠĠĠĠĠĠĠ ĠIn te gers Ġ{ Ġinput , Ġ_ Ġ-> Ġmessage Provider ( input . toString (), Ġintegers ) Ġ} ( inte gers ). adapt Ġ{ ĠBigDecimal ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpecial ized Ġ[ Digits ] ĠRule Ġthat Ġignores Ġthe Ġ" inte gers " Ġpart . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġprovider Ġon Ġfail . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes ĠInput Ġand ĠFr actions Ġas Ġargs Ġand Ġreturns Ġthe Ġmessage . ĊĠĠĠĠ Ġ* Ġ@ return Ġ`( Int ) Ġ-> ĠValidation ` Ġthat Ġtakes ĠFr actions Ġas Ġarg . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠFr actions ( ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( Number , ĠInt ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġintegers Ġ-> Ġ"$ input Ġnumber Ġmust Ġhave Ġ$ inte gers Ġfr actions " Ġ} ĊĠĠĠ Ġ): Ġ( Int ) Ġ-> ĠValidation < Number > Ġ= Ġ{ Ġfr actions Ġ-> ĊĠĠĠĠĠĠĠ ĠDig its Ġ{ Ġinput , Ġ_, Ġ_ Ġ-> Ġmessage Provider ( input , Ġfr actions ) Ġ} ( IGNORE , Ġfr actions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpecial ized Ġ[ Digits Str ] ĠRule Ġthat Ġignores Ġthe Ġ" inte gers " Ġpart . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġprovider Ġon Ġfail . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes ĠInput Ġand ĠFr actions Ġas Ġargs Ġand Ġreturns Ġthe Ġmessage . ĊĠĠĠĠ Ġ* Ġ@ return Ġ`( String ) Ġ-> ĠValidation ` Ġthat Ġtakes ĠFr actions Ġas Ġarg . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠFr actions Str ( ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( String , ĠInt ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġintegers Ġ-> Ġ"$ input Ġnumber Ġmust Ġhave Ġ$ inte gers Ġfr actions " Ġ} ĊĠĠĠ Ġ): Ġ( Int ) Ġ-> ĠValidation < String > Ġ= Ġ{ Ġfr actions Ġ-> ĊĠĠĠĠĠĠĠ ĠFr actions Ġ{ Ġinput , Ġ_ Ġ-> Ġmessage Provider ( input . toString (), Ġfr actions ) Ġ} ( fr actions ). adapt Ġ{ ĠBigDecimal ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġsize Ġof Ġthe Ġfield Ġor Ġproperty Ġis Ġevaluated Ġand Ġmust Ġmatch Ġthe Ġspecified Ġboundaries . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġfield Ġor Ġproperty Ġis Ġa ĠString , Ġthe Ġsize Ġof Ġthe Ġstring Ġis Ġevaluated . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġfield Ġor Ġproperty Ġis Ġa ĠCollection , Ġthe Ġsize Ġof Ġthe ĠCollection Ġis Ġevaluated . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġfield Ġor Ġproperty Ġis Ġa ĠMap , Ġthe Ġsize Ġof Ġthe ĠMap Ġis Ġevaluated . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġfield Ġor Ġproperty Ġis Ġan Ġarray , Ġthe Ġsize Ġof Ġthe Ġarray Ġis Ġevaluated . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUse Ġone Ġof Ġthe Ġoptional Ġmax Ġor Ġmin Ġelements Ġto Ġspecify Ġthe Ġboundaries . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠT Ġtype . ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġprovider Ġon Ġfail . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes ĠInput , ĠMin , ĠMax Ġas Ġargs Ġand Ġreturns Ġthe Ġmessage . ĊĠĠĠĠ Ġ* Ġ@ return Ġ`( Int , ĠInt ) Ġ-> ĠValidation < T >` Ġwhere ĠMin Ġand ĠMax Ġare Ġargs . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > ĠSize ( ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( T , ĠInt , ĠInt ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġmin , Ġmax Ġ-> Ġ"$ input Ġsize Ġbe Ġbetween Ġ[$ min , Ġ$ max ]" Ġ} ĊĠĠĠ Ġ): Ġ( Int , ĠInt ) Ġ-> ĠValidation < T > Ġ= Ġ{ Ġmin , Ġmax Ġ-> ĊĠĠĠĠĠĠĠ ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġsize Of ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror On Fail ( message Provider ( input , Ġmin , Ġmax )) Ġ{ Ġsize Ġ< Ġmin Ġ|| Ġsize Ġ> Ġmax Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġmatch Ġthe Ġregular Ġexpression Ġdefined Ġin Ġthe Ġregexp Ġelement . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġoptions Ġ[ Regex Option ] Ġset . ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġprovider . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes Ġinput Ġand Ġthe Ġregex Ġexpression Ġas Ġargs . ĊĠĠĠĠ Ġ* Ġ@ return Ġ( String ) Ġ-> ĠValidation Ġwhere Ġregex Ġexpression Ġis Ġtaken Ġas Ġarg . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠPattern ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġoptions : ĠRegex Option , ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( CharSequence , ĠString ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġexpression Ġ-> Ġ"$ expression Ġis Ġnot Ġmatching Ġ$ input " Ġ} ĊĠĠĠ Ġ): Ġ( String ) Ġ-> ĠValidation < CharSequence > Ġ= Ġ{ Ġexpression Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġregex Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . isEmpty () Ġ-> Ġexpression . to Regex () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . size Ġ== Ġ 1 Ġ-> Ġexpression . to Regex ( options . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexpression . to Regex ( options . toSet ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror On Fail ( message Provider ( input , Ġexpression )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! regex . matches ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġa Ġvalid Ġemail Ġaddress . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt Ġuses Ġ[ Pattern ] Ġinternally . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġprovider . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes Ġinput Ġand Ġthe Ġregex Ġemail Ġas Ġargs . ĊĠĠĠĠ Ġ* Ġ@ return ĠValidation < CharSequence >. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠEmail ( message Provider : Ġ( CharSequence , ĠString ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġ_ Ġ-> Ġ"$ input Ġis Ġinvalid Ġe - mail ." Ġ}): ĠValidation < CharSequence > Ġ= ĊĠĠĠĠĠĠĠ Ġ""" Ċ (?: [ a - z 0 - 9 ! # ${ '$ '} % & '* +/ =? ^ _` { |} ~ - ]+ (?: \. [ a - z 0 - 9 ! # ${ '$ '} % & '* +/ =? ^ _` { |} ~ - ]+ )* |" Ċ (?: [\ x 0 1 -\ x 0 8 \ x 0 b \ x 0 c \ x 0 e -\ x 1 f \ x 2 1 \ x 2 3 -\ x 5 b \ x 5 d -\ x 7 f ]| \\ [\ x 0 1 -\ x 0 9 \ x 0 b \ x 0 c \ x 0 e -\ x 7 f ])* ") Ċ @ (?: (?: [ a - z 0 - 9 ]( ?: [ a - z 0 - 9 - ]* [ a - z 0 - 9 ]) ? \. )+ [ a - z 0 - 9 ] Ċ (?: [ a - z 0 - 9 - ]* [ a - z 0 - 9 ]) ? |\ [( ?: (?: 2 5 [ 0 - 5 ]| 2 [ 0 - 4 ][ 0 - 9 ] |[ 0 1 ]? [ 0 - 9 ][ 0 - 9 ]? )\ . ){ 3 } Ċ (?: 2 5 [ 0 - 5 ]| 2 [ 0 - 4 ][ 0 - 9 ] |[ 0 1 ]? [ 0 - 9 ][ 0 - 9 ]? |[ a - z 0 - 9 - ]* [ a - z 0 - 9 ]: Ċ (?: [\ x 0 1 -\ x 0 8 \ x 0 b \ x 0 c \ x 0 e -\ x 1 f \ x 2 1 -\ x 5 a \ x 5 3 -\ x 7 f ]| \\ [\ x 0 1 -\ x 0 9 \ x 0 b \ x 0 c \ x 0 e -\ x 7 f ]) +)\ ]) ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("\ n ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġregex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComp osed Validation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġat Ġ= Ġinput . lastIndexOf ("@ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġerror Ġif Ġlocal - part Ġis Ġlonger Ġthan Ġ 6 4 Ġcharacters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( at Ġ> Ġ 0 Ġ&& Ġinput . sub Sequence ( 0 , Ġat ). length Ġ> Ġ 6 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( message Provider ( input , Ġregex )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPattern ( Regex Option . IGNORE _ CASE , Ġmessage Provider Ġ= Ġmessage Provider )( regex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġa Ġpositive Ġnumber . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġprovider . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes Ġinput ĠNumber Ġas Ġarg . ĊĠĠĠĠ Ġ* Ġ@ return ĠValidation < Number >. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠPositive ( message Provider : Ġ( Number ) Ġ-> ĠString Ġ= Ġ{ Ġinput Ġ-> Ġ"$ input Ġshould Ġbe Ġpositive ." Ġ}): ĠValidation < Number > Ġ= ĊĠĠĠĠĠĠĠ ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror On Fail ( message Provider ( input )) Ġ{ Ġinput . to BigDecimal Internal () Ġ< ĠBigDecimal . ONE Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġa Ġpositive Ġor Ġzero Ġnumber . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġprovider . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes Ġinput ĠNumber Ġas Ġarg . ĊĠĠĠĠ Ġ* Ġ@ return ĠValidation < Number >. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠPositive Or Zero ( message Provider : Ġ( Number ) Ġ-> ĠString Ġ= Ġ{ Ġinput Ġ-> Ġ"$ input Ġshould Ġbe Ġpositive Ġor Ġzero ." Ġ}): ĠValidation < Number > Ġ= ĊĠĠĠĠĠĠĠ ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror On Fail ( message Provider ( input )) Ġ{ Ġinput . to BigDecimal Internal () Ġ< ĠBigDecimal . ZERO Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġa Ġnegative Ġnumber . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġprovider . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes Ġinput ĠNumber Ġas Ġarg . ĊĠĠĠĠ Ġ* Ġ@ return ĠValidation < Number >. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠNegative ( message Provider : Ġ( Number ) Ġ-> ĠString Ġ= Ġ{ Ġinput Ġ-> Ġ"$ input Ġshould Ġbe Ġnegative ." Ġ}): ĠValidation < Number > Ġ= ĊĠĠĠĠĠĠĠ ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror On Fail ( message Provider ( input )) Ġ{ Ġinput . to BigDecimal Internal () Ġ> ĠBigDecimal . valueOf (- 1 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġa Ġnegative Ġor Ġzero Ġnumber . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage Ġprovider . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes Ġinput ĠNumber Ġas Ġarg . ĊĠĠĠĠ Ġ* Ġ@ return ĠValidation < Number >. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠNegative Or Zero ( message Provider : Ġ( Number ) Ġ-> ĠString Ġ= Ġ{ Ġinput Ġ-> Ġ"$ input Ġshould Ġbe Ġnegative Ġor Ġzero ." Ġ}): ĠValidation < Number > Ġ= ĊĠĠĠĠĠĠĠ ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror On Fail ( message Provider ( input )) Ġ{ Ġinput . to BigDecimal Internal () Ġ> ĠBigDecimal . ZERO Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġa Ġdate Ġin Ġthe Ġpast . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnow Provider ĠNow ĠDate Ġprovider . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠProvides Ġcurrent ĠDate . ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage ĠProvider . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes Ġinput Ġand Ġnow Ġdate Ġreference Ġas Ġargs . ĊĠĠĠĠ Ġ* Ġ@ return ĠValidation < Date >. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠP ast ( ĊĠĠĠĠĠĠĠ Ġnow Provider : Ġ() Ġ-> ĠDate Ġ= Ġ{ ĠDate () Ġ}, ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( Date , ĠDate ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġnow Ġ-> Ġ"$ input Ġmust Ġbe Ġbefore Ġ$ now " Ġ} ĊĠĠĠ Ġ): ĠValidation < Date > Ġ= ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= Ġnow Provider () ĊĠĠĠĠĠĠĠ Ġerror On Fail ( message Provider ( input , Ġnow )) Ġ{ Ġinput Ġ== Ġnow Ġ|| Ġinput . after ( now ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* The Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġa Ġdate Ġor Ġtime Ġin Ġthe Ġpast Ġor Ġpresent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnow Provider ĠNow ĠDate Ġprovider . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠProvides Ġcurrent ĠDate . ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage ĠProvider . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes Ġinput Ġand Ġnow Ġdate Ġreference Ġas Ġargs . ĊĠĠĠĠ Ġ* Ġ@ return ĠValidation < Date >. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠP ast Or Present ( ĊĠĠĠĠĠĠĠ Ġnow Provider : Ġ() Ġ-> ĠDate Ġ= Ġ{ ĠDate () Ġ}, ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( Date , ĠDate ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġnow Ġ-> Ġ"$ input Ġmust Ġbe Ġbefore Ġor Ġsame Ġas Ġ$ now " Ġ} ĊĠĠĠ Ġ): ĠValidation < Date > Ġ= ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= Ġnow Provider () ĊĠĠĠĠĠĠĠ Ġerror On Fail ( message Provider ( input , Ġnow )) Ġ{ Ġinput . after ( now ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġa Ġdate Ġin Ġthe Ġfuture . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnow Provider ĠNow ĠDate Ġprovider . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠProvides Ġcurrent ĠDate . ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage ĠProvider . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes Ġinput Ġand Ġnow Ġdate Ġreference Ġas Ġargs . ĊĠĠĠĠ Ġ* Ġ@ return ĠValidation < Date >. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠFuture ( ĊĠĠĠĠĠĠĠ Ġnow Provider : Ġ() Ġ-> ĠDate Ġ= Ġ{ ĠDate () Ġ}, ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( Date , ĠDate ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġnow Ġ-> Ġ"$ input Ġmust Ġbe Ġafter Ġ$ now " Ġ} ĊĠĠĠ Ġ): ĠValidation < Date > Ġ= ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= Ġnow Provider () ĊĠĠĠĠĠĠĠ Ġerror On Fail ( message Provider ( input , Ġnow )) Ġ{ Ġinput Ġ== Ġnow Ġ|| Ġinput . before ( now ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* The Ġvalue Ġof Ġthe Ġfield Ġor Ġproperty Ġmust Ġbe Ġa Ġdate Ġor Ġtime Ġin Ġthe Ġfuture Ġor Ġpresent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnow Provider ĠNow ĠDate Ġprovider . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠProvides Ġcurrent ĠDate . ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Provider ĠMessage ĠProvider . ĊĠĠĠĠ Ġ* Ġ@ receiver ĠTakes Ġinput Ġand Ġnow Ġdate Ġreference Ġas Ġargs . ĊĠĠĠĠ Ġ* Ġ@ return ĠValidation < Date >. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠFuture Or Present ( ĊĠĠĠĠĠĠĠ Ġnow Provider : Ġ() Ġ-> ĠDate Ġ= Ġ{ ĠDate () Ġ}, ĊĠĠĠĠĠĠĠ Ġmessage Provider : Ġ( Date , ĠDate ) Ġ-> ĠString Ġ= Ġ{ Ġinput , Ġnow Ġ-> Ġ"$ input Ġmust Ġbe Ġafter Ġor Ġsame Ġas Ġ$ now " Ġ} ĊĠĠĠ Ġ): ĠValidation < Date > Ġ= ĠValidation Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= Ġnow Provider () ĊĠĠĠĠĠĠĠ Ġerror On Fail ( message Provider ( input , Ġnow )) Ġ{ Ġinput . before ( now ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ================= ============ ĠHEL PER S Ġ& ĠUT IL S Ġ================= ============ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠAdapter Ġfor Ġan Ġobject Ġthat Ġhas Ġsize / length Ġprops . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠT ĠCharSequence , ĠArray , ĠCollection , ĠMap Ġand Ġkotlin ĠArray ĠPri mitives Ġtypes Ġallowed . ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĠValue . ĊĠĠĠĠ Ġ* Ġ@ return ĠInt ĠSize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġsize Of ( value : ĠT ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCharSequence Ġ-> Ġvalue . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArray < *> Ġ-> Ġvalue . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠChar Array Ġ-> Ġvalue . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠByteArray Ġ-> Ġvalue . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠShort Array Ġ-> Ġvalue . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Array Ġ-> Ġvalue . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Array Ġ-> Ġvalue . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Array Ġ-> Ġvalue . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDouble Array Ġ-> Ġvalue . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCollection < *> Ġ-> Ġvalue . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMap < *, Ġ*> Ġ-> Ġvalue . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnsupported Ġtype Ġ${ value !! :: class . java . simple Name }, Ġallowed : ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCharSequence , ĠArray , ĠCollection , ĠMap Ġand ĠPrimitive ĠArray Ġ( CharArray , ĠInt Array Ġetc ...) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNumber Ġto Ġbig Ġdecimal . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠBigDecimal . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠNumber . to BigDecimal Internal (): ĠBigDecimal Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠFloat Ġ-> Ġthis . to BigDecimal () ĊĠĠĠĠĠĠĠ Ġis ĠDouble Ġ-> Ġthis . to BigDecimal () ĊĠĠĠĠĠĠĠ Ġis ĠBigDecimal Ġ-> Ġthis ĊĠĠĠĠĠĠĠ Ġis ĠBigInteger Ġ-> ĠBigDecimal ( this ) ĊĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> Ġthis . to BigDecimal () ĊĠĠĠĠĠĠĠ Ġis ĠLong Ġ-> Ġthis . to BigDecimal () ĊĠĠĠĠĠĠĠ Ġis ĠShort Ġ-> Ġthis . toInt (). to BigDecimal () ĊĠĠĠĠĠĠĠ Ġis ĠByte Ġ-> Ġthis . toInt (). to BigDecimal () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unsupported Ġtype Ġ${ this :: class . java . simple Name }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHand y Ġextension Ġto Ġcreate Ġa Ġ[ Math Context ] Ġused Ġby Ġ[ Min ] Ġand Ġ[ Max ] Ġfor Ġdecimal Ġscaling Ġwhen Ġdealing Ġwith ĊĠĠĠĠ Ġ* Ġfraction Ġinputs . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠReceiver Ġis Ġthe Ġnumber Ġof Ġdecimal Ġscale Ġafter Ġscaling Ġwill Ġkick Ġin . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠExample : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ" 3 . scale ( Round ingMode . HALF _ E VEN )" ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġrounding Mode Ġ[ Round ingMode ] Ġstrategy . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠInt . scale ( rounding Mode : ĠRound ingMode Ġ= ĠRound ingMode . HALF _ UP ) Ġ= ĠScale ( this , Ġrounding Mode ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠScale Ġinfo Ġneeded Ġby ĠMin Ġand ĠMax Ġrules ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ property Ġvalue ĠValue . ĊĠĠĠĠ Ġ* Ġ@ property Ġrounding Mode Ġ[ Round ingMode ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠScale ( val Ġvalue : ĠInt Ġ= Ġ 0 , Ġval Ġrounding Mode : ĠRound ingMode Ġ= ĠRound ingMode . HALF _ UP ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠValue Ġused Ġby ĠDig its Ġand Ġthe Ġspecialized ĠDig its Ġto ĊĠĠĠĠ Ġ* Ġignore Ġthe Ġinteger Ġor Ġthe Ġfraction Ġpart ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconst Ġval ĠIG NORE Ġ= ĠInt . MAX _ VALUE Ċ } Ċ