package Ġcom . fl a quir 4 . code test . presentation . login . validator Ċ Ċ import Ġcat . helm . result . Result Ċ import Ġcat . helm . result . as Failure Ċ import Ġcat . helm . result . as Success Ċ import Ġjava . util . regex . Pattern Ċ Ċ interface ĠForm Validator < Error Ġ: ĠException > Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ MIN _ PASSWORD _ SIZE Ġ= Ġ 8 ĊĠĠĠĠĠĠĠ Ġval ĠE MAIL _ ADDRESS : ĠPattern Ġ= ĠPattern . compile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ a - zA - Z 0 - 9 \\ + \\. \\ _ \\ % \\ - \\ + ]{ 1 , 2 5 6 }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ @" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ a - zA - Z 0 - 9 ][ a - zA - Z 0 - 9 \\ - ]{ 0 , 6 4 }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"(" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ ." Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ a - zA - Z 0 - 9 ][ a - zA - Z 0 - 9 \\ - ]{ 0 , 2 5 }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ") +" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠString . is An Email (): ĠResult < Unit , ĠLogin Error > Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( EMAIL _ ADDRESS . matcher ( this ). matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUnit . as Success () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogin Error . Wrong Email Format . as Failure () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠString . email Is NotEmpty (): ĠResult < Unit , ĠLogin Error > Ġ= ĊĠĠĠĠĠĠĠ Ġis nt Empty (). map Error Ġ{ ĠLogin Error . Empty Email Ġ} ĊĊĠĠĠ Ġfun ĠString . password Is NotEmpty (): ĠResult < Unit , ĠLogin Error > Ġ= ĊĠĠĠĠĠĠĠ Ġis nt Empty (). map Error Ġ{ ĠLogin Error . Empty Password Ġ} ĊĊĠĠĠ Ġfun ĠString . has En ough Length ( required Length : ĠInt Ġ= ĠDEFAULT _ MIN _ PASSWORD _ SIZE ): ĠResult < Unit , ĠLogin Error > Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( length Ġ>= Ġrequired Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUnit . as Success () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogin Error . Short Password . as Failure () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvalidate ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġresult Sequence : ĠResult < Unit , ĠLogin Error >, ĊĠĠĠĠĠĠĠ ĠonError : Ġ( List < Error >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfailures Ġ= Ġresult Sequence . filter Is Instance < Result . Failure < Error >> (). map Ġ{ Ġit . exception Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( failures . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( failures ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . is nt Empty (): ĠResult < Unit , Ġkotlin . Error > Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUnit . as Success () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . Error (). as Failure () ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ