package Ġcom . nick per ov . labs . code stats . calc . cli Ċ Ċ import Ġcom . nick per ov . labs . code stats . calc . base . model . Source Code Stats Ċ import Ġcom . nick per ov . labs . code stats . calc . coroutines . Cor outines Immutable Code Stats Calculator Ċ import Ġkotlinx . cli .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĊĠĠĠ Ġval Ġprogress Ġ= Ġchar ArrayOf (' |', Ġ'/', Ġ'-', Ġ'\\ ') ĊĠĠĠ Ġval Ġcode Stats Ġ= ĠCor outines Immutable Code Stats Calculator () ĊĠĠĠĠĊĠĠĠ Ġval Ġparser Ġ= ĠArg Parser (" code - stats ") ĊĠĠĠ Ġval Ġdirectory Ġby Ġparser . option ( Arg Type . String , Ġshort Name Ġ= Ġ" d ", Ġdescription Ġ= Ġ" Input Ġdirectory "). required () ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġparser . parse ( args ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln ( e . message ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdir Ġ= ĠFile ( directory ) ĊĠĠĠ Ġif Ġ(! dir . exists () Ġ&& Ġ! dir . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Directory Ġdoes Ġnot Ġexists ") ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠOptional < Source Code Stats > Ġ= ĠOptional . empty () ĊĠĠĠĠĠĠĠ Ġval Ġcalculation Ġ= ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠOptional . of ( code Stats . calc Directory ( dir )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprogress index Ġ= Ġ 0 ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( calculation . is Completed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint ("\ r ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( calculation . is Cancelled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Calculation Ġcancelled ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint ("\ r ĠCalcul ating ..." Ġ+ Ġprogress [( progress index ++) Ġ% Ġprogress . size ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcode Stats Ġ= Ġresult . orElse Throw (); ĊĊĠĠĠĠĠĠĠ Ġprintln (" Code Ġstats Ġresult Ġfor Ġdirectory : Ġ" Ġ+ Ġdir . absolute File . normalize (). path ) ĊĠĠĠĠĠĠĠ Ġprintln (" ĠĠ ĠNumber Ġof Ġsource Ġfiles : Ġ" Ġ+ Ġcode Stats . numberOf Files ()) ĊĠĠĠĠĠĠĠ Ġprintln (" ĠĠ ĠNumber Ġof Ġcode Ġlines : Ġ" Ġ+ Ġcode Stats . numberOf Code Lines ()) ĊĠĠĠĠĠĠĠ Ġprintln (" ĠĠ ĠNumber Ġof Ġcomment Ġlines : Ġ" Ġ+ Ġcode Stats . numberOf Comment Lines ()) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Failed Ġto Ġcal ulate : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} Ċ }