@@ -48,7 +48,7 @@ use crate::renderer::source_map::{
48
48
} ;
49
49
use crate :: renderer:: styled_buffer:: StyledBuffer ;
50
50
use crate :: snippet:: Id ;
51
- use crate :: { Annotation , AnnotationKind , Element , Group , Origin , Patch , Snippet , Title } ;
51
+ use crate :: { Annotation , AnnotationKind , Element , Group , Message , Origin , Patch , Snippet , Title } ;
52
52
pub use anstyle:: * ;
53
53
use margin:: Margin ;
54
54
use std:: borrow:: Cow ;
@@ -303,7 +303,20 @@ impl Renderer {
303
303
title,
304
304
max_line_num_len,
305
305
title_style,
306
- matches ! ( peek, Some ( Element :: Title ( _) ) ) ,
306
+ matches ! ( peek, Some ( Element :: Title ( _) | Element :: Message ( _) ) ) ,
307
+ buffer_msg_line_offset,
308
+ ) ;
309
+ last_was_suggestion = false ;
310
+ }
311
+ Element :: Message ( title) => {
312
+ let title_style = TitleStyle :: Secondary ;
313
+ let buffer_msg_line_offset = buffer. num_lines ( ) ;
314
+ self . render_title (
315
+ & mut buffer,
316
+ title,
317
+ max_line_num_len,
318
+ title_style,
319
+ matches ! ( peek, Some ( Element :: Title ( _) | Element :: Message ( _) ) ) ,
307
320
buffer_msg_line_offset,
308
321
) ;
309
322
last_was_suggestion = false ;
@@ -336,6 +349,16 @@ impl Renderer {
336
349
) ;
337
350
}
338
351
352
+ Some ( Element :: Message ( level) )
353
+ if level. level . name != Some ( None ) =>
354
+ {
355
+ self . draw_col_separator_no_space (
356
+ & mut buffer,
357
+ current_line,
358
+ max_line_num_len + 1 ,
359
+ ) ;
360
+ }
361
+
339
362
None if group_len > 1 => self . draw_col_separator_end (
340
363
& mut buffer,
341
364
current_line,
@@ -503,23 +526,23 @@ impl Renderer {
503
526
fn render_title (
504
527
& self ,
505
528
buffer : & mut StyledBuffer ,
506
- title : & Title < ' _ > ,
529
+ title : & dyn MessageOrTitle ,
507
530
max_line_num_len : usize ,
508
531
title_style : TitleStyle ,
509
532
is_cont : bool ,
510
533
buffer_msg_line_offset : usize ,
511
534
) {
512
535
let ( label_style, title_element_style) = match title_style {
513
536
TitleStyle :: MainHeader => (
514
- ElementStyle :: Level ( title. level . level ) ,
537
+ ElementStyle :: Level ( title. level ( ) . level ) ,
515
538
if self . short_message {
516
539
ElementStyle :: NoStyle
517
540
} else {
518
541
ElementStyle :: MainHeaderMsg
519
542
} ,
520
543
) ,
521
544
TitleStyle :: Header => (
522
- ElementStyle :: Level ( title. level . level ) ,
545
+ ElementStyle :: Level ( title. level ( ) . level ) ,
523
546
ElementStyle :: HeaderMsg ,
524
547
) ,
525
548
TitleStyle :: Secondary => {
@@ -538,10 +561,10 @@ impl Renderer {
538
561
} ;
539
562
let mut label_width = 0 ;
540
563
541
- if title. level . name != Some ( None ) {
542
- buffer. append ( buffer_msg_line_offset, title. level . as_str ( ) , label_style) ;
543
- label_width += title. level . as_str ( ) . len ( ) ;
544
- if let Some ( Id { id : Some ( id) , url } ) = & title. id {
564
+ if title. level ( ) . name != Some ( None ) {
565
+ buffer. append ( buffer_msg_line_offset, title. level ( ) . as_str ( ) , label_style) ;
566
+ label_width += title. level ( ) . as_str ( ) . len ( ) ;
567
+ if let Some ( Id { id : Some ( id) , url } ) = & title. id ( ) {
545
568
buffer. append ( buffer_msg_line_offset, "[" , label_style) ;
546
569
if let Some ( url) = url. as_ref ( ) {
547
570
buffer. append (
@@ -584,10 +607,10 @@ impl Renderer {
584
607
label_width
585
608
} ) ;
586
609
587
- let ( title_str, style) = if title. is_pre_styled {
588
- ( title. text . to_string ( ) , ElementStyle :: NoStyle )
610
+ let ( title_str, style) = if title. is_pre_styled ( ) {
611
+ ( title. text ( ) . to_owned ( ) , ElementStyle :: NoStyle )
589
612
} else {
590
- ( normalize_whitespace ( & title. text ) , title_element_style)
613
+ ( normalize_whitespace ( title. text ( ) ) , title_element_style)
591
614
} ;
592
615
for ( i, text) in title_str. lines ( ) . enumerate ( ) {
593
616
if i != 0 {
@@ -2532,6 +2555,43 @@ impl Renderer {
2532
2555
}
2533
2556
}
2534
2557
2558
+ trait MessageOrTitle {
2559
+ fn level ( & self ) -> & Level < ' _ > ;
2560
+ fn id ( & self ) -> Option < & Id < ' _ > > ;
2561
+ fn text ( & self ) -> & str ;
2562
+ fn is_pre_styled ( & self ) -> bool ;
2563
+ }
2564
+
2565
+ impl MessageOrTitle for Title < ' _ > {
2566
+ fn level ( & self ) -> & Level < ' _ > {
2567
+ & self . level
2568
+ }
2569
+ fn id ( & self ) -> Option < & Id < ' _ > > {
2570
+ self . id . as_ref ( )
2571
+ }
2572
+ fn text ( & self ) -> & str {
2573
+ self . text . as_ref ( )
2574
+ }
2575
+ fn is_pre_styled ( & self ) -> bool {
2576
+ false
2577
+ }
2578
+ }
2579
+
2580
+ impl MessageOrTitle for Message < ' _ > {
2581
+ fn level ( & self ) -> & Level < ' _ > {
2582
+ & self . level
2583
+ }
2584
+ fn id ( & self ) -> Option < & Id < ' _ > > {
2585
+ None
2586
+ }
2587
+ fn text ( & self ) -> & str {
2588
+ self . text . as_ref ( )
2589
+ }
2590
+ fn is_pre_styled ( & self ) -> bool {
2591
+ true
2592
+ }
2593
+ }
2594
+
2535
2595
// instead of taking the String length or dividing by 10 while > 0, we multiply a limit by 10 until
2536
2596
// we're higher. If the loop isn't exited by the `return`, the last multiplication will wrap, which
2537
2597
// is OK, because while we cannot fit a higher power of 10 in a usize, the loop will end anyway.
@@ -2846,7 +2906,10 @@ fn max_line_number(groups: &[Group<'_>]) -> usize {
2846
2906
v. elements
2847
2907
. iter ( )
2848
2908
. map ( |s| match s {
2849
- Element :: Title ( _) | Element :: Origin ( _) | Element :: Padding ( _) => 0 ,
2909
+ Element :: Title ( _)
2910
+ | Element :: Message ( _)
2911
+ | Element :: Origin ( _)
2912
+ | Element :: Padding ( _) => 0 ,
2850
2913
Element :: Cause ( cause) => {
2851
2914
let end = cause
2852
2915
. markers
0 commit comments