package Ġio . github . kot ools . csv . reader Ċ Ċ import Ġcom . github . do y aaaa aken . kotlin csv . client . Csv Reader Ċ import Ġcom . github . do y aaaa aken . kotlin csv . dsl . csv Reader Ċ import Ġio . github . kot ools . csv . common .* Ċ import Ġio . github . kot ools . csv . common . Target Ċ import Ġio . github . kot ools . types . string . NotBlank String Ċ import Ġio . github . kot ools . types . string . not Blank OrNull Ċ import Ġkotlin . reflect . K Class Ċ Ċ internal Ġin fix Ġfun Ġ< T Ġ: ĠAny > ĠK Class < T >. process Reader ( ĊĠĠĠ Ġconfiguration : ĠReader < T >. () Ġ-> ĠUnit Ċ ): ĠList < T > Ġ{ ĊĠĠĠ Ġval ĠdataType : ĠDataType < T > Ġ= ĠdataType ĊĠĠĠ Ġval Ġreader : ĠReader Implementation < T > Ġ= ĠReader Implementation < T >() ĊĠĠĠĠĠĠĠ Ġ. apply ( configuration ) ĊĠĠĠ Ġif Ġ(! reader . isValid ()) Ġinvalid Configuration Error () ĊĠĠĠ Ġreturn Ġfind Target ( reader . filePath ) ĊĠĠĠĠĠĠĠ Ġ. let ( reader :: read ) ĊĠĠĠĠĠĠĠ Ġ. map ( Map < String , ĠString >:: without Blank Keys ) ĊĠĠĠĠĠĠĠ Ġ. map ( dataType :: create Type ) ĊĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġreader . pagination ?. let ( it :: getPage ) Ġ?: Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġreader . filter ?. let ( it :: filter ) Ġ?: Ġit Ġ} Ċ } Ċ Ċ internal Ġin fix Ġfun Ġ< T Ġ: ĠAny > ĠK Class < T >. process Reader OrNull ( ĊĠĠĠ Ġconfiguration : ĠReader < T >. () Ġ-> ĠUnit Ċ ): ĠList < T >? Ġ= Ġtry Ġ{ ĊĠĠĠ Ġprocess Reader ( configuration ) Ċ } Ġcatch Ġ( exception : ĠIllegalStateException ) Ġ{ ĊĠĠĠ Ġnull Ċ } Ċ Ċ private Ġin fix Ġfun Ġ< T Ġ: ĠAny > ĠList < T >. getPage ( pagination : ĠReader . Pagination ): ĊĠĠĠĠĠĠĠ ĠList < T > Ġ= Ġchunk ed ( pagination . size ) ĊĠĠĠ Ġ. getOrElse ( pagination . page Ġ- Ġ 1 ) Ġ{ Ġempty List () Ġ} Ċ Ċ private Ġfun Ġ< V Ġ: ĠAny > ĠMap < String , ĠV >. without Blank Keys (): ĊĠĠĠĠĠĠĠ ĠMap < NotBlank String , ĠV > Ġ= Ġmap Keys Ġ{ ĊĠĠĠ Ġit . key . not Blank OrNull ĊĠĠĠĠĠĠĠ Ġ?: Ġerror (" CSV Ġfile 's Ġheader Ġshouldn 't Ġcontain Ġan Ġempty Ġstring ") Ċ } Ċ Ċ private Ġfun Ġ< T Ġ: ĠAny > ĠReader < T >. isValid (): ĠBoolean Ġ= Ġfile . isNotBlank () Ċ Ċ private Ġin fix Ġfun Ġ< T Ġ: ĠAny > ĠReader < T >. read ( target : ĠTarget ): ĊĠĠĠĠĠĠĠ ĠList < Map < String , ĠString >> Ġ{ ĊĠĠĠ Ġval Ġcsv : ĠCsv Reader Ġ= Ġcsv Reader Ġ{ ĊĠĠĠĠĠĠĠ Ġdelimiter Ġ= Ġseparator . value ĊĠĠĠĠĠĠĠ Ġskip Empty Line Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġwhen Ġ( target ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠTarget . File Ġ-> Ġcsv . read All With Header ( target . file ) ĊĠĠĠĠĠĠĠ Ġis ĠTarget . Stream Ġ-> Ġcsv . read All With Header ( target . stream ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠReader . Pagination . isValid (): ĠBoolean Ġ= Ġpage Ġ> Ġ 0 Ġ&& Ġsize Ġ> Ġ 1 Ċ Ċ private Ġclass ĠReader Implementation < T Ġ: ĠAny > Ġ: ĠManager Implementation (), ĊĠĠĠ ĠReader < T > Ġ{ ĊĠĠĠ Ġval Ġfilter : Ġ( T . () Ġ-> ĠBoolean )? Ġget () Ġ= Ġmutable Filter ĊĠĠĠ Ġval Ġpagination : ĠReader . Pagination ? Ġget () Ġ= Ġmutable Pagination ĊĊĠĠĠ Ġprivate Ġvar Ġmutable Pagination : ĠReader . Pagination ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmutable Filter : Ġ( T . () Ġ-> ĠBoolean )? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= Ġthis Ġ=== Ġother ĊĊĠĠĠ Ġoverride Ġfun Ġfilter ( predicate : ĠT . () Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutable Filter Ġ= Ġpredicate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= ĠSystem . identity HashCode ( this ) ĊĊĠĠĠ Ġoverride Ġfun Ġpagination ( configuration : ĠReader . Pagination . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutable Pagination Ġ= ĠPagination Implementation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply ( configuration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If ( Pagination Implementation :: isValid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠPagination Implementation Ġ: ĠReader . Pagination Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġpage : ĠInt Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġsize : ĠInt Ġ= Ġ 2 ĊĠĠĠ Ġ} Ċ } Ċ