@@ -8,17 +8,14 @@ use ratatui::{
88    prelude:: * , 
99    widgets:: Block , 
1010} ; 
11- use  std:: fmt:: Display ; 
1211use  std:: future:: Future ; 
1312use  std:: pin:: Pin ; 
1413use  std:: sync:: Arc ; 
15- use  tabled:: settings:: object:: { Column ,  Columns } ; 
16- use  tabled:: settings:: Modify ; 
1714use  tabled:: Tabled ; 
1815
1916static  ALL_METRICS :  & [ Metric ]  = & [ 
2017    Metric :: InstructionsUser , 
21-     Metric :: Cycles , 
18+     Metric :: CyclesUser , 
2219    Metric :: WallTime , 
2320    Metric :: MaxRSS , 
2421    Metric :: LinkedArtifactSize , 
@@ -31,7 +28,7 @@ static ALL_METRICS: &[Metric] = &[
3128    Metric :: CpuClock , 
3229    Metric :: CpuClockUser , 
3330    Metric :: CrateMetadataSize , 
34-     Metric :: CyclesUser , 
31+     Metric :: Cycles , 
3532    Metric :: DepGraphSize , 
3633    Metric :: DocByteSize , 
3734    Metric :: DwoFileSize , 
@@ -70,14 +67,14 @@ pub async fn compare_artifacts(
7067        commit :  Option < String > , 
7168        label :  & str , 
7269    )  -> anyhow:: Result < Option < Commit > >  { 
73-         Ok ( commit
70+         commit
7471            . map ( |commit| { 
7572                aids. iter ( ) 
7673                    . find ( |c| c. sha  == commit) 
7774                    . cloned ( ) 
7875                    . ok_or_else ( || anyhow:: anyhow!( "{label} commit {commit} not found" ) ) 
7976            } ) 
80-             . transpose ( ) ? ) 
77+             . transpose ( ) 
8178    } 
8279
8380    let  base:  Option < Commit >  = check_commit ( & aids,  base,  "Base" ) ?; 
@@ -111,8 +108,8 @@ pub async fn compare_artifacts(
111108        terminal. draw ( |frame| { 
112109            screen. draw ( frame) ; 
113110        } ) ?; 
114-         match  event:: read ( ) ? { 
115-             Event :: Key ( key_event )  =>  match  key_event. code  { 
111+         if   let   Event :: Key ( key_event )  =  event:: read ( ) ? { 
112+             match  key_event. code  { 
116113                KeyCode :: Char ( 'q' )  | KeyCode :: Esc  => break , 
117114                key => { 
118115                    if  let  Some ( action)  = screen. handle_key ( key) . await ? { 
@@ -123,8 +120,7 @@ pub async fn compare_artifacts(
123120                        } 
124121                    } 
125122                } 
126-             } , 
127-             _ => { } 
123+             } 
128124        } 
129125    } 
130126    ratatui:: restore ( ) ; 
@@ -301,7 +297,7 @@ impl CompareScreen {
301297        base :  Commit , 
302298        modified :  Commit , 
303299    )  -> anyhow:: Result < Self >  { 
304-         let  pstats  = load_data ( 
300+         let  data  = load_data ( 
305301            metric, 
306302            & db_state. index , 
307303            db_state. db . as_mut ( ) , 
@@ -314,10 +310,22 @@ impl CompareScreen {
314310            modified, 
315311            db_state, 
316312            metric, 
317-             data :  pstats , 
313+             data, 
318314            table_state :  TableState :: default ( ) , 
319315        } ) 
320316    } 
317+ 
318+     async  fn  reload_data ( & mut  self )  -> anyhow:: Result < ( ) >  { 
319+         self . data  = load_data ( 
320+             self . metric , 
321+             & self . db_state . index , 
322+             self . db_state . db . as_mut ( ) , 
323+             & self . base , 
324+             & self . modified , 
325+         ) 
326+         . await ?; 
327+         Ok ( ( ) ) 
328+     } 
321329} 
322330
323331impl  Screen  for  CompareScreen  { 
@@ -330,15 +338,20 @@ impl Screen for CompareScreen {
330338                [ 
331339                    // +2 because of borders 
332340                    Constraint :: Min ( ( summary_table. lines ( ) . count ( )  + 2 )  as  u16 ) , 
341+                     Constraint :: Length ( 2 ) , 
333342                    Constraint :: Percentage ( 100 ) , 
334343                ] 
335344                . as_ref ( ) , 
336345            ) 
337346            . split ( frame. area ( ) ) ; 
347+ 
338348        frame. render_widget ( 
339349            Paragraph :: new ( Text :: raw ( summary_table) ) . block ( Block :: bordered ( ) . title ( "Summary" ) ) , 
340350            layout[ 0 ] , 
341351        ) ; 
352+ 
353+         render_metric ( frame,  self . metric ,  layout[ 1 ] ) ; 
354+ 
342355        let  header = Row :: new ( vec ! [ 
343356            Line :: from( "Benchmark" ) , 
344357            Line :: from( "Profile" ) , 
@@ -398,7 +411,7 @@ impl Screen for CompareScreen {
398411        . row_highlight_style ( Style :: new ( ) . bold ( ) ) ; 
399412
400413        let  table_layout =
401-             Layout :: new ( Direction :: Horizontal ,  [ Constraint :: Max ( 120 ) ] ) . split ( layout[ 1 ] ) ; 
414+             Layout :: new ( Direction :: Horizontal ,  [ Constraint :: Max ( 120 ) ] ) . split ( layout[ 2 ] ) ; 
402415        frame. render_stateful_widget ( table,  table_layout[ 0 ] ,  & mut  self . table_state ) ; 
403416    } 
404417
@@ -410,6 +423,14 @@ impl Screen for CompareScreen {
410423            match  key { 
411424                KeyCode :: Down  => self . table_state . select_next ( ) , 
412425                KeyCode :: Up  => self . table_state . select_previous ( ) , 
426+                 KeyCode :: Char ( 'a' )  => { 
427+                     self . metric  = select_metric ( self . metric ,  -1 ) ; 
428+                     self . reload_data ( ) . await ?; 
429+                 } 
430+                 KeyCode :: Char ( 's' )  => { 
431+                     self . metric  = select_metric ( self . metric ,  1 ) ; 
432+                     self . reload_data ( ) . await ?; 
433+                 } 
413434                _ => { } 
414435            } 
415436
@@ -418,6 +439,23 @@ impl Screen for CompareScreen {
418439    } 
419440} 
420441
442+ fn  select_metric ( current :  Metric ,  direction :  isize )  -> Metric  { 
443+     let  index = ALL_METRICS . iter ( ) . position ( |m| * m == current) . unwrap_or ( 0 )  as  isize ; 
444+     let  index = ( ( index + direction)  + ALL_METRICS . len ( )  as  isize )  % ALL_METRICS . len ( )  as  isize ; 
445+     ALL_METRICS [ index as  usize ] 
446+ } 
447+ 
448+ fn  render_metric ( frame :  & mut  Frame ,  metric :  Metric ,  area :  Rect )  { 
449+     frame. render_widget ( 
450+         Line :: from ( vec ! [ 
451+             "Metric: " . into( ) , 
452+             metric. as_str( ) . bold( ) , 
453+             " (switch: A/S)" . into( ) , 
454+         ] ) , 
455+         area, 
456+     ) 
457+ } 
458+ 
421459async  fn  load_data ( 
422460    metric :  Metric , 
423461    index :  & Index , 
@@ -429,7 +467,7 @@ async fn load_data(
429467    let  resp = query
430468        . execute ( 
431469            conn, 
432-             & index, 
470+             index, 
433471            Arc :: new ( vec ! [ 
434472                ArtifactId :: Commit ( base. clone( ) ) , 
435473                ArtifactId :: Commit ( modified. clone( ) ) , 
@@ -497,26 +535,19 @@ struct Regression {
497535    count :  usize , 
498536    #[ tabled( display( "display_range" ) ) ]  
499537    range :  ( Option < f64 > ,  Option < f64 > ) , 
500-     #[ tabled( display( "display_mean " ) ) ]  
538+     #[ tabled( display( "format_value " ) ) ]  
501539    mean :  Option < f64 > , 
502540} 
503541
504- fn  format_value ( value :  Option < f64 > )  -> String  { 
542+ fn  format_value ( value :  & Option < f64 > )  -> String  { 
505543    match  value { 
506-         Some ( value)  => format ! ( "{:+.2}%" ,  value ) , 
544+         Some ( value)  => format ! ( "{value :+.2}%" ) , 
507545        None  => "-" . to_string ( ) , 
508546    } 
509547} 
510548
511549fn  display_range ( & ( min,  max) :  & ( Option < f64 > ,  Option < f64 > ) )  -> String  { 
512-     format ! ( "[{}, {}]" ,  & format_value( min) ,  & format_value( max) ) 
513- } 
514- 
515- fn  display_mean ( value :  & Option < f64 > )  -> String  { 
516-     match  value { 
517-         Some ( value)  => format ! ( "{:+.2}%" ,  value) , 
518-         None  => "-" . to_string ( ) , 
519-     } 
550+     format ! ( "[{}, {}]" ,  & format_value( & min) ,  & format_value( & max) ) 
520551} 
521552
522553impl  From < & Vec < f64 > >  for  Regression  { 
0 commit comments