@@ -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,
@@ -384,7 +407,8 @@ impl Renderer {
384
407
if g == 0
385
408
&& ( matches ! ( section, Element :: Origin ( _) )
386
409
|| ( matches ! ( section, Element :: Title ( _) ) && i == 0 )
387
- || matches ! ( section, Element :: Title ( level) if level. level. name == Some ( None ) ) )
410
+ || matches ! ( section, Element :: Title ( level) if level. level. name == Some ( None ) )
411
+ || matches ! ( section, Element :: Message ( level) if level. level. name == Some ( None ) ) )
388
412
{
389
413
let current_line = buffer. num_lines ( ) ;
390
414
if peek. is_none ( ) && group_len > 1 {
@@ -394,6 +418,13 @@ impl Renderer {
394
418
max_line_num_len + 1 ,
395
419
) ;
396
420
} else if matches ! ( peek, Some ( Element :: Title ( level) ) if level. level. name != Some ( None ) )
421
+ {
422
+ self . draw_col_separator_no_space (
423
+ & mut buffer,
424
+ current_line,
425
+ max_line_num_len + 1 ,
426
+ ) ;
427
+ } else if matches ! ( peek, Some ( Element :: Message ( level) ) if level. level. name != Some ( None ) )
397
428
{
398
429
self . draw_col_separator_no_space (
399
430
& mut buffer,
@@ -503,23 +534,23 @@ impl Renderer {
503
534
fn render_title (
504
535
& self ,
505
536
buffer : & mut StyledBuffer ,
506
- title : & Title < ' _ > ,
537
+ title : & dyn MessageOrTitle ,
507
538
max_line_num_len : usize ,
508
539
title_style : TitleStyle ,
509
540
is_cont : bool ,
510
541
buffer_msg_line_offset : usize ,
511
542
) {
512
543
let ( label_style, title_element_style) = match title_style {
513
544
TitleStyle :: MainHeader => (
514
- ElementStyle :: Level ( title. level . level ) ,
545
+ ElementStyle :: Level ( title. level ( ) . level ) ,
515
546
if self . short_message {
516
547
ElementStyle :: NoStyle
517
548
} else {
518
549
ElementStyle :: MainHeaderMsg
519
550
} ,
520
551
) ,
521
552
TitleStyle :: Header => (
522
- ElementStyle :: Level ( title. level . level ) ,
553
+ ElementStyle :: Level ( title. level ( ) . level ) ,
523
554
ElementStyle :: HeaderMsg ,
524
555
) ,
525
556
TitleStyle :: Secondary => {
@@ -538,10 +569,10 @@ impl Renderer {
538
569
} ;
539
570
let mut label_width = 0 ;
540
571
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 {
572
+ if title. level ( ) . name != Some ( None ) {
573
+ buffer. append ( buffer_msg_line_offset, title. level ( ) . as_str ( ) , label_style) ;
574
+ label_width += title. level ( ) . as_str ( ) . len ( ) ;
575
+ if let Some ( Id { id : Some ( id) , url } ) = & title. id ( ) {
545
576
buffer. append ( buffer_msg_line_offset, "[" , label_style) ;
546
577
if let Some ( url) = url. as_ref ( ) {
547
578
buffer. append (
@@ -584,10 +615,10 @@ impl Renderer {
584
615
label_width
585
616
} ) ;
586
617
587
- let ( title_str, style) = if title. is_pre_styled {
588
- ( title. text . to_string ( ) , ElementStyle :: NoStyle )
618
+ let ( title_str, style) = if title. is_pre_styled ( ) {
619
+ ( title. text ( ) . to_owned ( ) , ElementStyle :: NoStyle )
589
620
} else {
590
- ( normalize_whitespace ( & title. text ) , title_element_style)
621
+ ( normalize_whitespace ( title. text ( ) ) , title_element_style)
591
622
} ;
592
623
for ( i, text) in title_str. lines ( ) . enumerate ( ) {
593
624
if i != 0 {
@@ -2532,6 +2563,43 @@ impl Renderer {
2532
2563
}
2533
2564
}
2534
2565
2566
+ trait MessageOrTitle {
2567
+ fn level ( & self ) -> & Level < ' _ > ;
2568
+ fn id ( & self ) -> Option < & Id < ' _ > > ;
2569
+ fn text ( & self ) -> & str ;
2570
+ fn is_pre_styled ( & self ) -> bool ;
2571
+ }
2572
+
2573
+ impl MessageOrTitle for Title < ' _ > {
2574
+ fn level ( & self ) -> & Level < ' _ > {
2575
+ & self . level
2576
+ }
2577
+ fn id ( & self ) -> Option < & Id < ' _ > > {
2578
+ self . id . as_ref ( )
2579
+ }
2580
+ fn text ( & self ) -> & str {
2581
+ self . text . as_ref ( )
2582
+ }
2583
+ fn is_pre_styled ( & self ) -> bool {
2584
+ false
2585
+ }
2586
+ }
2587
+
2588
+ impl MessageOrTitle for Message < ' _ > {
2589
+ fn level ( & self ) -> & Level < ' _ > {
2590
+ & self . level
2591
+ }
2592
+ fn id ( & self ) -> Option < & Id < ' _ > > {
2593
+ None
2594
+ }
2595
+ fn text ( & self ) -> & str {
2596
+ self . text . as_ref ( )
2597
+ }
2598
+ fn is_pre_styled ( & self ) -> bool {
2599
+ true
2600
+ }
2601
+ }
2602
+
2535
2603
// instead of taking the String length or dividing by 10 while > 0, we multiply a limit by 10 until
2536
2604
// we're higher. If the loop isn't exited by the `return`, the last multiplication will wrap, which
2537
2605
// is OK, because while we cannot fit a higher power of 10 in a usize, the loop will end anyway.
@@ -2846,7 +2914,10 @@ fn max_line_number(groups: &[Group<'_>]) -> usize {
2846
2914
v. elements
2847
2915
. iter ( )
2848
2916
. map ( |s| match s {
2849
- Element :: Title ( _) | Element :: Origin ( _) | Element :: Padding ( _) => 0 ,
2917
+ Element :: Title ( _)
2918
+ | Element :: Message ( _)
2919
+ | Element :: Origin ( _)
2920
+ | Element :: Padding ( _) => 0 ,
2850
2921
Element :: Cause ( cause) => {
2851
2922
let end = cause
2852
2923
. markers
0 commit comments