@@ -78,7 +78,7 @@ impl fmt::Write for PadAdapter<'_, '_> {
7878///
7979/// assert_eq!(
8080/// format!("{:?}", Foo { bar: 10, baz: "Hello World".to_string() }),
81- /// "Foo { bar: 10, baz: \ "Hello World\ " }",
81+ /// r# "Foo { bar: 10, baz: "Hello World" }"# ,
8282/// );
8383/// ```
8484#[ must_use = "must eventually call `finish()` on Debug builders" ]
@@ -125,7 +125,7 @@ impl<'a, 'b: 'a> DebugStruct<'a, 'b> {
125125 ///
126126 /// assert_eq!(
127127 /// format!("{:?}", Bar { bar: 10, another: "Hello World".to_string() }),
128- /// "Bar { bar: 10, another: \ "Hello World\ ", nonexistent_field: 1 }",
128+ /// r# "Bar { bar: 10, another: "Hello World", nonexistent_field: 1 }"# ,
129129 /// );
130130 /// ```
131131 #[ stable( feature = "debug_builders" , since = "1.2.0" ) ]
@@ -237,7 +237,7 @@ impl<'a, 'b: 'a> DebugStruct<'a, 'b> {
237237 ///
238238 /// assert_eq!(
239239 /// format!("{:?}", Bar { bar: 10, baz: "Hello World".to_string() }),
240- /// "Bar { bar: 10, baz: \ "Hello World\ " }",
240+ /// r# "Bar { bar: 10, baz: "Hello World" }"# ,
241241 /// );
242242 /// ```
243243 #[ stable( feature = "debug_builders" , since = "1.2.0" ) ]
@@ -280,7 +280,7 @@ impl<'a, 'b: 'a> DebugStruct<'a, 'b> {
280280///
281281/// assert_eq!(
282282/// format!("{:?}", Foo(10, "Hello World".to_string())),
283- /// "Foo(10, \ "Hello World\ ")",
283+ /// r# "Foo(10, "Hello World")"# ,
284284/// );
285285/// ```
286286#[ must_use = "must eventually call `finish()` on Debug builders" ]
@@ -322,7 +322,7 @@ impl<'a, 'b: 'a> DebugTuple<'a, 'b> {
322322 ///
323323 /// assert_eq!(
324324 /// format!("{:?}", Foo(10, "Hello World".to_string())),
325- /// "Foo(10, \ "Hello World\ ")",
325+ /// r# "Foo(10, "Hello World")"# ,
326326 /// );
327327 /// ```
328328 #[ stable( feature = "debug_builders" , since = "1.2.0" ) ]
@@ -360,6 +360,51 @@ impl<'a, 'b: 'a> DebugTuple<'a, 'b> {
360360 self
361361 }
362362
363+ /// Marks the tuple struct as non-exhaustive, indicating to the reader that there are some
364+ /// other fields that are not shown in the debug representation.
365+ ///
366+ /// # Examples
367+ ///
368+ /// ```
369+ /// #![feature(debug_more_non_exhaustive)]
370+ ///
371+ /// use std::fmt;
372+ ///
373+ /// struct Foo(i32, String);
374+ ///
375+ /// impl fmt::Debug for Foo {
376+ /// fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
377+ /// fmt.debug_tuple("Foo")
378+ /// .field(&self.0)
379+ /// .finish_non_exhaustive() // Show that some other field(s) exist.
380+ /// }
381+ /// }
382+ ///
383+ /// assert_eq!(
384+ /// format!("{:?}", Foo(10, "secret!".to_owned())),
385+ /// "Foo(10, ..)",
386+ /// );
387+ /// ```
388+ #[ unstable( feature = "debug_more_non_exhaustive" , issue = "127942" ) ]
389+ pub fn finish_non_exhaustive ( & mut self ) -> fmt:: Result {
390+ self . result = self . result . and_then ( |_| {
391+ if self . fields > 0 {
392+ if self . is_pretty ( ) {
393+ let mut slot = None ;
394+ let mut state = Default :: default ( ) ;
395+ let mut writer = PadAdapter :: wrap ( self . fmt , & mut slot, & mut state) ;
396+ writer. write_str ( "..\n " ) ?;
397+ self . fmt . write_str ( ")" )
398+ } else {
399+ self . fmt . write_str ( ", ..)" )
400+ }
401+ } else {
402+ self . fmt . write_str ( "(..)" )
403+ }
404+ } ) ;
405+ self . result
406+ }
407+
363408 /// Finishes output and returns any error encountered.
364409 ///
365410 /// # Examples
@@ -381,7 +426,7 @@ impl<'a, 'b: 'a> DebugTuple<'a, 'b> {
381426 ///
382427 /// assert_eq!(
383428 /// format!("{:?}", Foo(10, "Hello World".to_string())),
384- /// "Foo(10, \ "Hello World\ ")",
429+ /// r# "Foo(10, "Hello World")"# ,
385430 /// );
386431 /// ```
387432 #[ stable( feature = "debug_builders" , since = "1.2.0" ) ]
@@ -555,6 +600,56 @@ impl<'a, 'b: 'a> DebugSet<'a, 'b> {
555600 self
556601 }
557602
603+ /// Marks the set as non-exhaustive, indicating to the reader that there are some other
604+ /// elements that are not shown in the debug representation.
605+ ///
606+ /// # Examples
607+ ///
608+ /// ```
609+ /// #![feature(debug_more_non_exhaustive)]
610+ ///
611+ /// use std::fmt;
612+ ///
613+ /// struct Foo(Vec<i32>);
614+ ///
615+ /// impl fmt::Debug for Foo {
616+ /// fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
617+ /// // Print at most two elements, abbreviate the rest
618+ /// let mut f = fmt.debug_set();
619+ /// let mut f = f.entries(self.0.iter().take(2));
620+ /// if self.0.len() > 2 {
621+ /// f.finish_non_exhaustive()
622+ /// } else {
623+ /// f.finish()
624+ /// }
625+ /// }
626+ /// }
627+ ///
628+ /// assert_eq!(
629+ /// format!("{:?}", Foo(vec![1, 2, 3, 4])),
630+ /// "{1, 2, ..}",
631+ /// );
632+ /// ```
633+ #[ unstable( feature = "debug_more_non_exhaustive" , issue = "127942" ) ]
634+ pub fn finish_non_exhaustive ( & mut self ) -> fmt:: Result {
635+ self . inner . result = self . inner . result . and_then ( |_| {
636+ if self . inner . has_fields {
637+ if self . inner . is_pretty ( ) {
638+ let mut slot = None ;
639+ let mut state = Default :: default ( ) ;
640+ let mut writer = PadAdapter :: wrap ( self . inner . fmt , & mut slot, & mut state) ;
641+ writer. write_str ( "..\n " ) ?;
642+ self . inner . fmt . write_str ( "}" )
643+ } else {
644+ self . inner . fmt . write_str ( ", ..}" )
645+ }
646+ } else {
647+ self . inner . fmt . write_str ( "..}" )
648+ }
649+ } ) ;
650+ self . inner . result
651+ }
652+
558653 /// Finishes output and returns any error encountered.
559654 ///
560655 /// # Examples
@@ -699,6 +794,55 @@ impl<'a, 'b: 'a> DebugList<'a, 'b> {
699794 self
700795 }
701796
797+ /// Marks the list as non-exhaustive, indicating to the reader that there are some other
798+ /// elements that are not shown in the debug representation.
799+ ///
800+ /// # Examples
801+ ///
802+ /// ```
803+ /// #![feature(debug_more_non_exhaustive)]
804+ ///
805+ /// use std::fmt;
806+ ///
807+ /// struct Foo(Vec<i32>);
808+ ///
809+ /// impl fmt::Debug for Foo {
810+ /// fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
811+ /// // Print at most two elements, abbreviate the rest
812+ /// let mut f = fmt.debug_list();
813+ /// let mut f = f.entries(self.0.iter().take(2));
814+ /// if self.0.len() > 2 {
815+ /// f.finish_non_exhaustive()
816+ /// } else {
817+ /// f.finish()
818+ /// }
819+ /// }
820+ /// }
821+ ///
822+ /// assert_eq!(
823+ /// format!("{:?}", Foo(vec![1, 2, 3, 4])),
824+ /// "[1, 2, ..]",
825+ /// );
826+ /// ```
827+ #[ unstable( feature = "debug_more_non_exhaustive" , issue = "127942" ) ]
828+ pub fn finish_non_exhaustive ( & mut self ) -> fmt:: Result {
829+ self . inner . result . and_then ( |_| {
830+ if self . inner . has_fields {
831+ if self . inner . is_pretty ( ) {
832+ let mut slot = None ;
833+ let mut state = Default :: default ( ) ;
834+ let mut writer = PadAdapter :: wrap ( self . inner . fmt , & mut slot, & mut state) ;
835+ writer. write_str ( "..\n " ) ?;
836+ self . inner . fmt . write_str ( "]" )
837+ } else {
838+ self . inner . fmt . write_str ( ", ..]" )
839+ }
840+ } else {
841+ self . inner . fmt . write_str ( "..]" )
842+ }
843+ } )
844+ }
845+
702846 /// Finishes output and returns any error encountered.
703847 ///
704848 /// # Examples
@@ -750,7 +894,7 @@ impl<'a, 'b: 'a> DebugList<'a, 'b> {
750894///
751895/// assert_eq!(
752896/// format!("{:?}", Foo(vec![("A".to_string(), 10), ("B".to_string(), 11)])),
753- /// "{\"A\ ": 10, \"B\ ": 11}",
897+ /// r#"{"A ": 10, "B ": 11}"# ,
754898/// );
755899/// ```
756900#[ must_use = "must eventually call `finish()` on Debug builders" ]
@@ -790,7 +934,7 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> {
790934 ///
791935 /// assert_eq!(
792936 /// format!("{:?}", Foo(vec![("A".to_string(), 10), ("B".to_string(), 11)])),
793- /// "{\ "whole\ ": [(\"A\ ", 10), (\"B\ ", 11)]}",
937+ /// r#"{ "whole": [("A ", 10), ("B ", 11)]}"# ,
794938 /// );
795939 /// ```
796940 #[ stable( feature = "debug_builders" , since = "1.2.0" ) ]
@@ -826,7 +970,7 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> {
826970 ///
827971 /// assert_eq!(
828972 /// format!("{:?}", Foo(vec![("A".to_string(), 10), ("B".to_string(), 11)])),
829- /// "{\ "whole\ ": [(\"A\ ", 10), (\"B\ ", 11)]}",
973+ /// r#"{ "whole": [("A ", 10), ("B ", 11)]}"# ,
830974 /// );
831975 /// ```
832976 #[ stable( feature = "debug_map_key_value" , since = "1.42.0" ) ]
@@ -902,7 +1046,7 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> {
9021046 ///
9031047 /// assert_eq!(
9041048 /// format!("{:?}", Foo(vec![("A".to_string(), 10), ("B".to_string(), 11)])),
905- /// "{\ "whole\ ": [(\"A\ ", 10), (\"B\ ", 11)]}",
1049+ /// r#"{ "whole": [("A ", 10), ("B ", 11)]}"# ,
9061050 /// );
9071051 /// ```
9081052 #[ stable( feature = "debug_map_key_value" , since = "1.42.0" ) ]
@@ -960,7 +1104,7 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> {
9601104 ///
9611105 /// assert_eq!(
9621106 /// format!("{:?}", Foo(vec![("A".to_string(), 10), ("B".to_string(), 11)])),
963- /// "{\"A\ ": 10, \"B\ ": 11}",
1107+ /// r#"{"A ": 10, "B ": 11}"# ,
9641108 /// );
9651109 /// ```
9661110 #[ stable( feature = "debug_builders" , since = "1.2.0" ) ]
@@ -976,6 +1120,62 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> {
9761120 self
9771121 }
9781122
1123+ /// Marks the map as non-exhaustive, indicating to the reader that there are some other
1124+ /// entries that are not shown in the debug representation.
1125+ ///
1126+ /// # Examples
1127+ ///
1128+ /// ```
1129+ /// #![feature(debug_more_non_exhaustive)]
1130+ ///
1131+ /// use std::fmt;
1132+ ///
1133+ /// struct Foo(Vec<(String, i32)>);
1134+ ///
1135+ /// impl fmt::Debug for Foo {
1136+ /// fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
1137+ /// // Print at most two elements, abbreviate the rest
1138+ /// let mut f = fmt.debug_map();
1139+ /// let mut f = f.entries(self.0.iter().take(2).map(|&(ref k, ref v)| (k, v)));
1140+ /// if self.0.len() > 2 {
1141+ /// f.finish_non_exhaustive()
1142+ /// } else {
1143+ /// f.finish()
1144+ /// }
1145+ /// }
1146+ /// }
1147+ ///
1148+ /// assert_eq!(
1149+ /// format!("{:?}", Foo(vec![
1150+ /// ("A".to_string(), 10),
1151+ /// ("B".to_string(), 11),
1152+ /// ("C".to_string(), 12),
1153+ /// ])),
1154+ /// r#"{"A": 10, "B": 11, ..}"#,
1155+ /// );
1156+ /// ```
1157+ #[ unstable( feature = "debug_more_non_exhaustive" , issue = "127942" ) ]
1158+ pub fn finish_non_exhaustive ( & mut self ) -> fmt:: Result {
1159+ self . result = self . result . and_then ( |_| {
1160+ assert ! ( !self . has_key, "attempted to finish a map with a partial entry" ) ;
1161+
1162+ if self . has_fields {
1163+ if self . is_pretty ( ) {
1164+ let mut slot = None ;
1165+ let mut state = Default :: default ( ) ;
1166+ let mut writer = PadAdapter :: wrap ( self . fmt , & mut slot, & mut state) ;
1167+ writer. write_str ( "..\n " ) ?;
1168+ self . fmt . write_str ( "}" )
1169+ } else {
1170+ self . fmt . write_str ( ", ..}" )
1171+ }
1172+ } else {
1173+ self . fmt . write_str ( "..}" )
1174+ }
1175+ } ) ;
1176+ self . result
1177+ }
1178+
9791179 /// Finishes output and returns any error encountered.
9801180 ///
9811181 /// # Panics
@@ -1000,7 +1200,7 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> {
10001200 ///
10011201 /// assert_eq!(
10021202 /// format!("{:?}", Foo(vec![("A".to_string(), 10), ("B".to_string(), 11)])),
1003- /// "{\"A\ ": 10, \"B\ ": 11}",
1203+ /// r#"{"A ": 10, "B ": 11}"# ,
10041204 /// );
10051205 /// ```
10061206 #[ stable( feature = "debug_builders" , since = "1.2.0" ) ]
0 commit comments