package Ġtech . dn ene . kt config Ċ Ċ import Ġarrow . core . Either Ċ import Ġarrow . core . left Ċ import Ġarrow . core . right Ċ import Ġarrow . instances . either . mon ad . binding Ċ import Ġjava . io . File Ċ Ċ interface ĠBuilder < T > Ġ{ ĊĠĠĠ Ġfun Ġbuild (): ĠEither < String , ĠT > Ċ } Ċ Ċ fun Ġconfig ( block : ĠConfig Builder . () Ġ-> ĠConfig Builder ) Ġ= ĊĠĠĠĠĠĠĠ ĠConfig Builder (). apply Ġ{ Ġblock () Ġ} Ċ Ċ class ĠConfig Builder : ĠBuilder < Config > Ġ{ ĊĠĠĠ Ġvar Ġserver Config Builder : ĠServer Config Builder ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġpath Config Builder : ĠPath Config Builder ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġfun Ġbuild (): ĠEither < String , ĠConfig > Ġ= ĊĠĠĠĠĠĠĠ Ġserver Config Builder ?. let Ġ{ Ġsc Builder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Config Builder ?. let Ġ{ Ġpc Builder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding < String , ĠConfig > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Config Ġ= Ġsc Builder . build (). bind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Config Ġ= Ġpc Builder . build (). bind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig ( server Config , Ġpath Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ" path Ġconfiguration Ġmust Ġbe Ġspecified ". left () ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ" server Ġconfiguration Ġmust Ġbe Ġspecified ". left () ĊĠĠĠ Ġfun Ġserver ( block : ĠServer Config Builder . () Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Ġ{ Ġserver Config Builder Ġ= ĠServer Config Builder (). apply Ġ{ Ġblock () Ġ} Ġ} ĊĊĠĠĠ Ġfun Ġpath ( block : ĠPath Config Builder . () Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Ġ{ Ġpath Config Builder Ġ= ĠPath Config Builder (). apply Ġ{ Ġblock () Ġ} Ġ} Ċ } Ċ Ċ class ĠServer Config Builder : ĠBuilder < Server Config > Ġ{ ĊĠĠĠ Ġvar Ġhost : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġport : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġfun Ġbuild (): ĠEither < String , ĠServer Config > Ġ= ĊĠĠĠĠĠĠĠ Ġhost ?. let Ġ{ Ġhost Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġport ?. let Ġ{ Ġport Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer Config ( host , Ġport ). right () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ" port Ġmust Ġbe Ġspecified ". left () ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ" host Ġmust Ġbe Ġspecified ". left () Ċ } Ċ Ċ class ĠPath Config Builder : ĠBuilder < Path Config > Ġ{ ĊĠĠĠ Ġvar Ġtmp DirPath : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġfun Ġbuild (): ĠEither < String , ĠPath Config > Ġ= ĊĠĠĠĠĠĠĠ Ġtmp DirPath ?. let Ġ{ Ġtmp DirPath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( tmp DirPath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . exists () Ġ&& Ġfile . isDirectory Ġ&& Ġfile . can Write ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath Config ( file . to Path ()). right () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" tmp DirPath Ġmust Ġbe Ġa Ġwrite able Ġdirectory ". left () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ" tmp DirPath Ġmust Ġbe Ġspecified ". left () Ċ }