@@ -3,78 +3,80 @@ use JsonValue;
33pub trait Generator {
44 fn new_line ( & mut self ) { }
55
6- fn write ( & mut self , slice : & str ) ;
6+ fn write ( & mut self , slice : & [ u8 ] ) ;
77
8- fn write_min ( & mut self , slice : & str , minslice : & str ) ;
8+ fn write_min ( & mut self , slice : & [ u8 ] , minslice : & [ u8 ] ) ;
99
10- fn write_char ( & mut self , ch : char ) ;
10+ fn write_char ( & mut self , ch : u8 ) ;
1111
1212 fn indent ( & mut self ) { }
1313
1414 fn dedent ( & mut self ) { }
1515
16+ fn write_string ( & mut self , string : & str ) {
17+ self . write_char ( b'"' ) ;
18+
19+ for ch in string. bytes ( ) {
20+ match ch {
21+ b'\\' | b'"' => {
22+ self . write_char ( b'\\' ) ;
23+ self . write_char ( ch) ;
24+ } ,
25+ b'\n' => self . write ( b"\\ n" ) ,
26+ b'\r' => self . write ( b"\\ r" ) ,
27+ b'\t' => self . write ( b"\\ t" ) ,
28+ 0xC => self . write ( b"\\ f" ) ,
29+ 0x8 => self . write ( b"\\ b" ) ,
30+ _ => self . write_char ( ch)
31+ }
32+ }
33+
34+ self . write_char ( b'"' ) ;
35+ }
36+
1637 fn write_json ( & mut self , json : & JsonValue ) {
1738 match * json {
18- JsonValue :: String ( ref string) => {
19- self . write_char ( '"' ) ;
20-
21- for ch in string. chars ( ) {
22- match ch {
23- '\\' | '"' => {
24- self . write_char ( '\\' ) ;
25- self . write_char ( ch) ;
26- } ,
27- '\n' => self . write ( "\\ n" ) ,
28- '\r' => self . write ( "\\ r" ) ,
29- '\t' => self . write ( "\\ t" ) ,
30- '\u{000C}' => self . write ( "\\ f" ) ,
31- '\u{0008}' => self . write ( "\\ b" ) ,
32- _ => self . write_char ( ch)
33- }
34- }
35-
36- self . write_char ( '"' ) ;
37- } ,
38- JsonValue :: Number ( ref number) => self . write ( & number. to_string ( ) ) ,
39- JsonValue :: Boolean ( ref value) => self . write ( if * value { "true" } else { "false" } ) ,
40- JsonValue :: Null => self . write ( "null" ) ,
39+ JsonValue :: String ( ref string) => self . write_string ( string) ,
40+ JsonValue :: Number ( ref number) => self . write ( number. to_string ( ) . as_bytes ( ) ) ,
41+ JsonValue :: Boolean ( ref value) => self . write ( if * value { b"true" } else { b"false" } ) ,
42+ JsonValue :: Null => self . write ( b"null" ) ,
4143 JsonValue :: Array ( ref array) => {
42- self . write_char ( '[' ) ;
44+ self . write_char ( b '[') ;
4345 self . indent ( ) ;
4446 let mut first = true ;
4547 for item in array {
4648 if first {
4749 first = false ;
4850 self . new_line ( ) ;
4951 } else {
50- self . write ( "," ) ;
52+ self . write ( b ",") ;
5153 self . new_line ( ) ;
5254 }
5355 self . write_json ( item) ;
5456 }
5557 self . dedent ( ) ;
5658 self . new_line ( ) ;
57- self . write_char ( ']' ) ;
59+ self . write_char ( b ']') ;
5860 } ,
5961 JsonValue :: Object ( ref object) => {
60- self . write_char ( '{' ) ;
62+ self . write_char ( b '{') ;
6163 self . indent ( ) ;
6264 let mut first = true ;
6365 for ( key, value) in object. iter ( ) {
6466 if first {
6567 first = false ;
6668 self . new_line ( ) ;
6769 } else {
68- self . write ( "," ) ;
70+ self . write ( b ",") ;
6971 self . new_line ( ) ;
7072 }
71- self . write ( & format ! ( "{:?}" , key) ) ;
72- self . write_min ( ": " , ":" ) ;
73+ self . write_string ( key) ;
74+ self . write_min ( b ": ", b ":") ;
7375 self . write_json ( value) ;
7476 }
7577 self . dedent ( ) ;
7678 self . new_line ( ) ;
77- self . write_char ( '}' ) ;
79+ self . write_char ( b '}') ;
7880 }
7981 }
8082 }
@@ -83,45 +85,45 @@ pub trait Generator {
8385}
8486
8587pub struct DumpGenerator {
86- code : String ,
88+ code : Vec < u8 > ,
8789}
8890
8991impl DumpGenerator {
9092 pub fn new ( ) -> Self {
9193 DumpGenerator {
92- code : String :: with_capacity ( 1024 ) ,
94+ code : Vec :: with_capacity ( 1024 ) ,
9395 }
9496 }
9597}
9698
9799impl Generator for DumpGenerator {
98- fn write ( & mut self , slice : & str ) {
99- self . code . push_str ( slice) ;
100+ fn write ( & mut self , slice : & [ u8 ] ) {
101+ self . code . extend_from_slice ( slice) ;
100102 }
101103
102- fn write_min ( & mut self , _: & str , minslice : & str ) {
103- self . write ( minslice) ;
104+ fn write_min ( & mut self , _: & [ u8 ] , minslice : & [ u8 ] ) {
105+ self . code . extend_from_slice ( minslice) ;
104106 }
105107
106- fn write_char ( & mut self , ch : char ) {
108+ fn write_char ( & mut self , ch : u8 ) {
107109 self . code . push ( ch) ;
108110 }
109111
110112 fn consume ( self ) -> String {
111- self . code
113+ String :: from_utf8 ( self . code ) . unwrap ( )
112114 }
113115}
114116
115117pub struct PrettyGenerator {
116- code : String ,
118+ code : Vec < u8 > ,
117119 dent : u16 ,
118120 spaces_per_indent : u16 ,
119121}
120122
121123impl PrettyGenerator {
122124 pub fn new ( spaces : u16 ) -> Self {
123125 PrettyGenerator {
124- code : String :: with_capacity ( 1024 ) ,
126+ code : Vec :: with_capacity ( 1024 ) ,
125127 dent : 0 ,
126128 spaces_per_indent : spaces
127129 }
@@ -130,21 +132,21 @@ impl PrettyGenerator {
130132
131133impl Generator for PrettyGenerator {
132134 fn new_line ( & mut self ) {
133- self . code . push ( '\n' ) ;
135+ self . code . push ( b '\n') ;
134136 for _ in 0 ..( self . dent * self . spaces_per_indent ) {
135- self . code . push ( ' ' ) ;
137+ self . code . push ( b ' ') ;
136138 }
137139 }
138140
139- fn write ( & mut self , slice : & str ) {
140- self . code . push_str ( slice) ;
141+ fn write ( & mut self , slice : & [ u8 ] ) {
142+ self . code . extend_from_slice ( slice) ;
141143 }
142144
143- fn write_min ( & mut self , slice : & str , _: & str ) {
144- self . write ( slice) ;
145+ fn write_min ( & mut self , slice : & [ u8 ] , _: & [ u8 ] ) {
146+ self . code . extend_from_slice ( slice) ;
145147 }
146148
147- fn write_char ( & mut self , ch : char ) {
149+ fn write_char ( & mut self , ch : u8 ) {
148150 self . code . push ( ch) ;
149151 }
150152
@@ -157,6 +159,6 @@ impl Generator for PrettyGenerator {
157159 }
158160
159161 fn consume ( self ) -> String {
160- self . code
162+ String :: from_utf8 ( self . code ) . unwrap ( )
161163 }
162164}
0 commit comments