@@ -94,8 +94,15 @@ impl<W> FormatBuffer<W> {
9494 . extend ( std:: iter:: repeat_n ( IndentGroup :: default ( ) , delta) ) ;
9595 }
9696
97- /// Dedent the buffer by delta
97+ /// Dedent the buffer by ` delta` levels. Panics if `delta` is too large.
9898 pub fn dedent ( & mut self , delta : usize ) {
99+ if delta > self . indents . len ( ) {
100+ panic ! (
101+ "Cannot dedent by {} levels: only {} levels present" ,
102+ delta,
103+ self . indents. len( )
104+ ) ;
105+ }
99106 self . indents . truncate ( self . indents . len ( ) - delta) ;
100107 }
101108
@@ -336,11 +343,12 @@ impl<W: Write> Write for FormatBuffer<W> {
336343#[ cfg( test) ]
337344mod tests {
338345 use super :: * ;
346+ use std:: panic:: { catch_unwind, AssertUnwindSafe } ;
339347
340348 const TAB_WIDTH : usize = 4 ;
341349
342350 #[ test]
343- fn test_buffer_indents ( ) -> std :: fmt :: Result {
351+ fn test_buffer_indents ( ) {
344352 let delta = 1 ;
345353
346354 let mut buf = FormatBuffer :: new ( String :: new ( ) , TAB_WIDTH ) ;
@@ -366,11 +374,12 @@ mod tests {
366374 assert_eq ! ( buf. level( ) , 0 ) ;
367375 assert_eq ! ( buf. current_indent_len( ) , 0 ) ;
368376
369- // panics on extra dedent
370- let res = std:: panic:: catch_unwind ( || buf. clone ( ) . dedent ( delta) ) ;
371- assert ! ( res. is_err( ) ) ;
372-
373- Ok ( ( ) )
377+ // should panic on extra dedent
378+ let res = catch_unwind ( AssertUnwindSafe ( || {
379+ let mut buf = buf. clone ( ) ;
380+ buf. dedent ( delta) ;
381+ } ) ) ;
382+ assert ! ( res. is_err( ) , "Expected panic on extra dedent, but did not get one" ) ;
374383 }
375384
376385 #[ test]
0 commit comments