package Ġcom . github . do y aaaa aken . kotlin csv . client Ċ Ċ import Ġcom . github . do y aaaa aken . kotlin csv . dsl . context . Csv Writer Context Ċ import Ġcom . github . do y aaaa aken . kotlin csv . dsl . context . Write Quote Mode Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . Flush able Ċ import Ġjava . io . IOException Ċ import Ġjava . io . PrintWriter Ċ Ċ /** Ċ Ġ* ĠCSV ĠWriter Ġclass , Ġwhich Ġcontrols Ġfile ĠI / O Ġflow . Ċ Ġ* Ċ Ġ* Ġ@ author Ġdo y aaaa aken Ċ Ġ*/ Ċ class ĠCsv FileWriter Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġctx : ĠCsv Writer Context , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġwriter : ĠPrintWriter Ċ ) Ġ: ĠIC sv FileWriter , ĠClose able , ĠFlush able Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġstate Ġhandling Ġto Ġwrite Ġtermin ator Ġfor Ġnext Ġline ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġstate Handler Ġ= ĠCsv Writer State Handler () ĊĊĠĠĠ Ġprivate Ġval Ġquote Needed Chars Ġ= Ġset Of ('\ r ', Ġ'\ n ', Ġctx . quote . char , Ġctx . delimiter ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġwrite Ġone Ġrow ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġwrite Row ( row : ĠList < Any ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwill Write Pre Termin ator () ĊĠĠĠĠĠĠĠ Ġwrite Next ( row ) ĊĠĠĠĠĠĠĠ Ġwill Write End Termin ator () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( writer . check Error ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Failed Ġto Ġwrite ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġwrite Ġone Ġrow ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġwrite Row ( var arg Ġentry : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Row ( entry . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġwrite Ġrows ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġwrite Rows ( rows : ĠList < List < Any ? >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġwill Write Pre Termin ator () ĊĠĠĠĠĠĠĠ Ġrows . forEach Indexed { Ġindex , Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Next ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġrows . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Termin ator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwill Write End Termin ator () ĊĠĠĠĠĠĠĠ Ġif Ġ( writer . check Error ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Failed Ġto Ġwrite ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġwrite Ġrows Ġfrom ĠSequence ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġwrite Rows ( rows : ĠSequence < List < Any ? >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġwill Write Pre Termin ator () ĊĊĠĠĠĠĠĠĠ Ġval Ġitr Ġ= Ġrows . iterator () ĊĠĠĠĠĠĠĠ Ġwhile ( itr . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Next ( itr . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( itr . hasNext ()) Ġwrite Termin ator () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwill Write End Termin ator () ĊĠĠĠĠĠĠĠ Ġif Ġ( writer . check Error ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Failed Ġto Ġwrite ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġflush () Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . flush () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Next ( row : ĠList < Any ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrow Str Ġ= Ġrow . map Ġ{ Ġfield Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . null Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattach Quote ( field . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. join ToString ( ctx . delimiter . toString ()) ĊĠĠĠĠĠĠĠ Ġwriter . print ( row Str ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwill Write End Termin ator () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ctx . output Last Line Termin ator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Termin ator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Handler . setState Of W rote Line End Termin ator () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Handler . setState Of Not W rote Line End Termin ator () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWill Ġwrite Ġtermin ator Ġif Ġand Ġonly Ġif ĊĠĠĠĠ Ġ* ĠĠ 1 . Ġhas Ġwrote Ġfirst Ġline ĊĠĠĠĠ Ġ* ĠĠ 2 . Ġstate Ġis Ġset Ġto Ġhas Ġnot Ġwrote Ġlast Ġline Ġtermin ator ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġwill Write Pre Termin ator () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Handler . has W rote First Line () Ġ&& Ġ! state Handler . has W rote Line End Termin ator ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Termin ator () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġwrite Ġtermin ator Ġfor Ġnext Ġline ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġwrite Termin ator () Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . print ( ctx . line Termin ator ) ĊĠĠĠĠĠĠĠ Ġstate Handler . setState Of W rote Line End Termin ator () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġattach Quote ( field : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshould Quote Ġ= Ġctx . quote . mode Ġ== ĠWrite Quote Mode . ALL Ġ|| Ġfield . any Ġ{ Ġch Ġ-> Ġquote Needed Chars . contains ( ch ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Quote ) Ġappend ( ctx . quote . char ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . forEach Ġ{ Ġch Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ch Ġ== Ġctx . quote . char ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( ctx . quote . char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( ch ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Quote ) Ġappend ( ctx . quote . char ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }