@@ -33,15 +33,17 @@ have to implement the `Formatter` trait.
3333
3434``` rust
3535use std :: collections :: HashMap ;
36+
3637type Data = HashMap <String , u32 >;
3738
3839trait Formatter {
39- fn format (& self , data : & Data , s : & mut String );
40+ fn format (& self , data : & Data , buf : & mut String );
4041}
4142
4243struct Report ;
4344
4445impl Report {
46+ // Write should be used but we kept it as String to ignore error handling
4547 fn generate <T : Formatter >(g : T , s : & mut String ) {
4648 // backend operations...
4749 let mut data = HashMap :: new ();
@@ -54,29 +56,25 @@ impl Report {
5456
5557struct Text ;
5658impl Formatter for Text {
57- fn format (& self , data : & Data , s : & mut String ) {
58- * s = data
59- . iter ()
60- . map ( | ( key , val ) | format! ( " {} {} \ n " , key , val ))
61- . collect ();
59+ fn format (& self , data : & Data , buf : & mut String ) {
60+ for ( k , v ) in data {
61+ let entry = format! ( " {} {} \ n " , k , v );
62+ buf . push_str ( & entry );
63+ }
6264 }
6365}
6466
6567struct Json ;
6668impl Formatter for Json {
67- fn format (& self , data : & Data , s : & mut String ) {
68- * s = String :: from (" [" );
69- let mut iter = data . into_iter ();
70- if let Some ((key , val )) = iter . next () {
71- let entry = format! (r # " {{"{}":"{}"}}" # , key , val );
72- s . push_str (& entry );
73- while let Some ((key , val )) = iter . next () {
74- s . push (',' );
75- let entry = format! (r # " {{"{}":"{}"}}" # , key , val );
76- s . push_str (& entry );
77- }
69+ fn format (& self , data : & Data , buf : & mut String ) {
70+ buf . push ('[' );
71+ for (k , v ) in data . into_iter () {
72+ let entry = format! (r # " {{"{}":"{}"}}" # , k , v );
73+ buf . push_str (& entry );
74+ buf . push (',' );
7875 }
79- s . push (']' );
76+ buf . pop (); // remove extra , at the end
77+ buf . push (']' );
8078 }
8179}
8280
@@ -86,6 +84,7 @@ fn main() {
8684 assert! (s . contains (" one 1" ));
8785 assert! (s . contains (" two 2" ));
8886
87+ s . clear (); // reuse the same buffer
8988 Report :: generate (Json , & mut s );
9089 assert! (s . contains (r # " {"one":"1"}" # ));
9190 assert! (s . contains (r # " {"two":"2"}" # ));
0 commit comments