@@ -27,34 +27,60 @@ fn main() {
2727 let individual_cost =
2828 full_price_count * args. ticket_price + discounted_count * ( args. ticket_price / 2 ) ;
2929
30- println ! (
31- "\n ╭{}╴{}╴{}╴{}╴╮" ,
32- "─" . repeat( 14 ) ,
33- "─" . repeat( 10 ) ,
34- "─" . repeat( 14 ) ,
35- "─" . repeat( 17 )
36- ) ;
37- println ! (
38- "│ {:14} │ {:10} │ {:14} │ {:10} │" ,
39- "Total trips" . cyan( ) . bold( ) ,
40- "Monthly" . cyan( ) . bold( ) ,
41- "Individual" . cyan( ) . bold( ) ,
42- "Ticket" . cyan( ) . bold( )
43- ) ;
44- println ! (
45- "│ {:14} │ {:>10} │ {:>14} │ {:>10} │" ,
46- format!( "{}" , total_trips) . yellow( ) ,
47- format!( "{} RUB" , args. monthly_cost) . yellow( ) ,
48- format!( "{} RUB" , individual_cost) . yellow( ) ,
49- format!( "{} RUB" , args. ticket_price) . yellow( )
50- ) ;
51- println ! (
52- "╰{}╴{}╴{}╴{}╯" ,
53- "─" . repeat( 14 ) ,
54- "─" . repeat( 10 ) ,
55- "─" . repeat( 14 ) ,
56- "─" . repeat( 18 )
57- ) ;
30+ let col1_data_plain = total_trips. to_string ( ) ;
31+ let col2_data_plain = format ! ( "{} RUB" , args. monthly_cost) ;
32+ let col3_data_plain = format ! ( "{} RUB" , individual_cost) ;
33+ let col4_data_plain = format ! ( "{} RUB" , args. ticket_price) ;
34+
35+ let headers = [ "Total Trips" , "Monthly" , "Individual" , "Tciket" ] ;
36+ let data = [
37+ & col1_data_plain,
38+ & col2_data_plain,
39+ & col3_data_plain,
40+ & col4_data_plain,
41+ ] ;
42+ let col_widths: Vec < usize > = headers
43+ . iter ( )
44+ . zip ( data. iter ( ) )
45+ . map ( |( h, d) | h. len ( ) . max ( d. len ( ) ) )
46+ . collect ( ) ;
47+
48+ let make_border = |left : & str , middle : & str , right : & str | {
49+ let mut parts = Vec :: new ( ) ;
50+ for & w in & col_widths {
51+ parts. push ( "─" . repeat ( w + 2 ) ) ;
52+ }
53+ format ! ( "{}{}{}" , left, parts. join( middle) , right)
54+ } ;
55+
56+ let top_border = make_border ( "╭" , "┬" , "╮" ) ;
57+ let middle_border = make_border ( "├" , "┼" , "┤" ) ;
58+ let bottom_border = make_border ( "╰" , "┴" , "╯" ) ;
59+
60+ let header_row = headers
61+ . iter ( )
62+ . enumerate ( )
63+ . map ( |( i, & h) | format ! ( " {:^width$} " , h. cyan( ) . bold( ) , width = col_widths[ i] ) )
64+ . collect :: < Vec < _ > > ( )
65+ . join ( "│" ) ;
66+
67+ let data_row = [
68+ col1_data_plain. yellow ( ) ,
69+ col2_data_plain. yellow ( ) ,
70+ col3_data_plain. yellow ( ) ,
71+ col4_data_plain. yellow ( ) ,
72+ ]
73+ . iter ( )
74+ . enumerate ( )
75+ . map ( |( i, cell) | format ! ( " {:^width$} " , cell, width = col_widths[ i] ) )
76+ . collect :: < Vec < _ > > ( )
77+ . join ( "│" ) ;
78+
79+ println ! ( "\n {}" , top_border) ;
80+ println ! ( "│{}│" , header_row) ;
81+ println ! ( "{}" , middle_border) ;
82+ println ! ( "│{}│" , data_row) ;
83+ println ! ( "{}" , bottom_border) ;
5884
5985 let message = match individual_cost. cmp ( & args. monthly_cost ) {
6086 std:: cmp:: Ordering :: Less => format ! (
0 commit comments