package Ġtech . k etc . k til . validation Ċ Ċ import Ġtech . k etc . k til .* Ċ import Ġkotlin . reflect .* Ċ import Ġkotlin . collections .* Ċ Ċ /** Ċ Ġ* ĠValidator Ċ Ġ*/ Ċ abstract Ġclass ĠValidator < T Ġ: ĠAny >( initializer : ĠValidation Scope < T >. () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ scope Ġ= ĠValidation Scope Impl < T >(). apply ( initializer ) ĊĠĠĠ Ġprivate Ġval Ġscope Ġget () Ġ= Ġ_ scope Ġas ĠValidation Scope Impl < *> ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġright Ġon Ġsuccessful Ġvalidation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġvalidate ( target : ĠT ): ĠValidation Result < T > Ġ= Ġ_ scope . validate ( target ) ĊĊĠĠĠ Ġprivate Ġclass ĠValidation Scope Impl < T Ġ: ĠAny > Ġ: ĠValidation Scope < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġvalidations Ġ= ĠLinkedList < Validation >() ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< P Ġ: ĠAny > ĠK Property 1 < T , ĠP ?> . shouldBe ( predicate : ĠPredicate < P >): ĠPredicate Holder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠValidation . Item Validation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġas ĠK Property 1 < Any , ĠAny ? >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpredicate Ġas ĠPredicate < Any > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidations . add ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġitem ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< P Ġ: ĠAny > ĠK Property 1 < T , ĠP ?> . validate By ( validator : ĠValidator < in ĠP >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposite Ġ= ĠValidation . Composite Validation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġas ĠK Property 1 < Any , ĠAny ? >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidator . scope Ġas ĠValidation Scope Impl < Any > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidations . add ( composite ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠK Class < T >. shouldBe ( predicate : ĠPredicate < T >): ĠPredicate Holder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠValidation . Class Item Validation ( predicate Ġas ĠPredicate < Any >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidations . add ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġitem ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠK Class < T >. validate By ( validator : ĠValidator < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposite Ġ= ĠValidation . Class Composite Validation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidator . scope Ġas ĠValidation Scope Impl < Any > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidations . add ( composite ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< P Ġ: ĠAny > ĠK Property 1 < T , ĠCollection < P ?> ?> . shouldBe Each ( predicate : ĠPredicate < P >): ĠPredicate Holder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠValidation . Collection Item Validation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġas ĠK Property 1 < Any , ĠCollection < Any ?> ? >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpredicate Ġas ĠPredicate < Any > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidations . add ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġitem ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< P Ġ: ĠAny > ĠK Property 1 < T , ĠCollection < P ?> ?> . validate By Each ( validator : ĠValidator < in ĠP >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposite Ġ= ĠValidation . Collection Composite Validation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġas ĠK Property 1 < Any , ĠCollection < Any ?> ? >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidator . scope Ġas ĠValidation Scope Impl < Any > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidations . add ( composite ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġvalidate ( target : ĠT ): ĠValidation Result < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerrors Ġ= ĠLinkedList < ValidationError >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( validation Ġin Ġvalidations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( validation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValidation . Item Validation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġvalidation . property . get ( target Ġas ĠAny ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( validation . predicate . validate ( value )) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġvalidation . run Ġ{ ĠValidationError ( property , Ġvalue , ĠerrorMessage ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValidation . Class Item Validation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( validation . predicate . validate ( target )) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġvalidation . run Ġ{ ĠValidationError ( null , Ġtarget , ĠerrorMessage ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValidation . Collection Item Validation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= Ġvalidation . property . get ( target Ġas ĠAny ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġcollection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! validation . predicate . validate ( item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġvalidation . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠValidationError ( property , Ġcollection , ĠerrorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValidation . Composite Validation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġvalidation . property . get ( target Ġas ĠAny ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġvalidation . scope . validate ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . is Right ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . addAll ( result . left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValidation . Class Composite Validation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġvalidation . scope . validate ( target ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . is Right ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . addAll ( result . left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValidation . Collection Composite Validation Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= Ġvalidation . property . get ( target Ġas ĠAny ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġcollection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġvalidation . scope . validate ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . is Left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . addAll ( result . left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEither . cond ( errors . isEmpty (), Ġtarget , Ġerrors ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsealed Ġclass ĠValidation Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ ERROR _ MESSAGE Ġ= Ġ" validation Ġerror " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠItem Validation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty : ĠK Property 1 < Any , ĠAny ? >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpredicate : ĠPredicate < Any > ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠValidation (), ĠPredicate Holder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠerrorMessage : ĠString Ġ= ĠDEFAULT _ ERROR _ MESSAGE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġotherwise ( errorMessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . errorMessage Ġ= ĠerrorMessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠClass Item Validation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpredicate : ĠPredicate < Any > ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠValidation (), ĠPredicate Holder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠerrorMessage : ĠString Ġ= ĠDEFAULT _ ERROR _ MESSAGE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġotherwise ( errorMessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . errorMessage Ġ= ĠerrorMessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠCollection Item Validation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty : ĠK Property 1 < Any , ĠCollection < Any ?> ? >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpredicate : ĠPredicate < Any >, ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠValidation (), ĠPredicate Holder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠerrorMessage : ĠString Ġ= ĠDEFAULT _ ERROR _ MESSAGE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġotherwise ( errorMessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . errorMessage Ġ= ĠerrorMessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠComposite Validation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty : ĠK Property 1 < Any , ĠAny ? >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope : ĠValidation Scope Impl < Any >, ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠValidation () ĊĊĠĠĠĠĠĠĠ Ġclass ĠClass Composite Validation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope : ĠValidation Scope Impl < Any >, ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠValidation () ĊĊĠĠĠĠĠĠĠ Ġclass ĠCollection Composite Validation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty : ĠK Property 1 < Any , ĠCollection < Any ?> ? >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope : ĠValidation Scope Impl < Any >, ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠValidation () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠValidator Internal < T Ġ: ĠAny >( ĊĠĠĠ Ġinitializer : ĠValidation Scope < T >. () Ġ-> ĠUnit Ċ ) Ġ: ĠValidator < T >( initializer ) Ċ Ċ fun Ġ< T Ġ: ĠAny > Ġvalidator ( ĊĠĠĠ Ġinitializer : ĠValidation Scope < T >. () Ġ-> ĠUnit Ċ ): ĠValidator < T > Ġ= ĠValidator Internal ( initializer ) Ċ