@@ -48,7 +48,7 @@ use crate::renderer::source_map::{
4848} ;
4949use crate :: renderer:: styled_buffer:: StyledBuffer ;
5050use 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 } ;
5252pub use anstyle:: * ;
5353use margin:: Margin ;
5454use std:: borrow:: Cow ;
@@ -303,7 +303,20 @@ impl Renderer {
303303 title,
304304 max_line_num_len,
305305 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 ( _) ) ) ,
307320 buffer_msg_line_offset,
308321 ) ;
309322 last_was_suggestion = false ;
@@ -336,6 +349,16 @@ impl Renderer {
336349 ) ;
337350 }
338351
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+
339362 None if group_len > 1 => self . draw_col_separator_end (
340363 & mut buffer,
341364 current_line,
@@ -384,7 +407,8 @@ impl Renderer {
384407 if g == 0
385408 && ( matches ! ( section, Element :: Origin ( _) )
386409 || ( 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 ) ) )
388412 {
389413 let current_line = buffer. num_lines ( ) ;
390414 if peek. is_none ( ) && group_len > 1 {
@@ -394,6 +418,13 @@ impl Renderer {
394418 max_line_num_len + 1 ,
395419 ) ;
396420 } 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 ) )
397428 {
398429 self . draw_col_separator_no_space (
399430 & mut buffer,
@@ -503,23 +534,23 @@ impl Renderer {
503534 fn render_title (
504535 & self ,
505536 buffer : & mut StyledBuffer ,
506- title : & Title < ' _ > ,
537+ title : & dyn MessageOrTitle ,
507538 max_line_num_len : usize ,
508539 title_style : TitleStyle ,
509540 is_cont : bool ,
510541 buffer_msg_line_offset : usize ,
511542 ) {
512543 let ( label_style, title_element_style) = match title_style {
513544 TitleStyle :: MainHeader => (
514- ElementStyle :: Level ( title. level . level ) ,
545+ ElementStyle :: Level ( title. level ( ) . level ) ,
515546 if self . short_message {
516547 ElementStyle :: NoStyle
517548 } else {
518549 ElementStyle :: MainHeaderMsg
519550 } ,
520551 ) ,
521552 TitleStyle :: Header => (
522- ElementStyle :: Level ( title. level . level ) ,
553+ ElementStyle :: Level ( title. level ( ) . level ) ,
523554 ElementStyle :: HeaderMsg ,
524555 ) ,
525556 TitleStyle :: Secondary => {
@@ -538,10 +569,10 @@ impl Renderer {
538569 } ;
539570 let mut label_width = 0 ;
540571
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 ( ) {
545576 buffer. append ( buffer_msg_line_offset, "[" , label_style) ;
546577 if let Some ( url) = url. as_ref ( ) {
547578 buffer. append (
@@ -584,10 +615,10 @@ impl Renderer {
584615 label_width
585616 } ) ;
586617
587- let ( title_str, style) = if title. is_pre_styled {
588- ( title. title . to_string ( ) , ElementStyle :: NoStyle )
618+ let ( title_str, style) = if title. is_pre_styled ( ) {
619+ ( title. text ( ) . to_owned ( ) , ElementStyle :: NoStyle )
589620 } else {
590- ( normalize_whitespace ( & title. title ) , title_element_style)
621+ ( normalize_whitespace ( title. text ( ) ) , title_element_style)
591622 } ;
592623 for ( i, text) in title_str. lines ( ) . enumerate ( ) {
593624 if i != 0 {
@@ -2532,6 +2563,43 @@ impl Renderer {
25322563 }
25332564}
25342565
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+
25352603// instead of taking the String length or dividing by 10 while > 0, we multiply a limit by 10 until
25362604// we're higher. If the loop isn't exited by the `return`, the last multiplication will wrap, which
25372605// 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 {
28462914 v. elements
28472915 . iter ( )
28482916 . 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 ,
28502921 Element :: Cause ( cause) => {
28512922 let end = cause
28522923 . markers
0 commit comments