16
16
17
17
//! json serialization
18
18
19
-
20
- use std:: char;
19
+ use std:: iterator;
21
20
use std:: float;
22
21
use std:: hashmap:: HashMap ;
23
- use std:: io:: { WriterUtil , ReaderUtil } ;
22
+ use std:: io:: WriterUtil ;
24
23
use std:: io;
25
24
use std:: str;
26
25
use std:: to_str;
@@ -481,24 +480,17 @@ pub fn to_pretty_str(json: &Json) -> ~str {
481
480
io:: with_str_writer ( |wr| to_pretty_writer ( wr, json) )
482
481
}
483
482
484
- static BUF_SIZE : uint = 64000 ;
485
-
486
- #[ allow( missing_doc) ]
487
- pub struct Parser {
488
- priv rdr: @io:: Reader ,
489
- priv buf: ~[ char ] ,
490
- priv buf_idx : uint ,
483
+ pub struct Parser < T > {
484
+ priv rdr: ~T ,
491
485
priv ch: char ,
492
486
priv line : uint ,
493
487
priv col: uint ,
494
488
}
495
489
496
- /// Decode a json value from an io::reader
497
- pub fn Parser ( rdr : @io :: Reader ) -> Parser {
490
+ /// Decode a json value from an Iterator<char>
491
+ pub fn Parser < T : iterator :: Iterator < char > > ( rdr : ~ T ) -> Parser < T > {
498
492
let mut p = Parser {
499
493
rdr : rdr,
500
- buf : rdr. read_chars ( BUF_SIZE ) ,
501
- buf_idx : 0 ,
502
494
ch : 0 as char ,
503
495
line : 1 ,
504
496
col : 0 ,
@@ -507,7 +499,7 @@ pub fn Parser(rdr: @io::Reader) -> Parser {
507
499
p
508
500
}
509
501
510
- impl Parser {
502
+ impl < T : iterator :: Iterator < char > > Parser < T > {
511
503
pub fn parse ( & mut self ) -> Result < Json , Error > {
512
504
match self . parse_value ( ) {
513
505
Ok ( value) => {
@@ -525,30 +517,20 @@ impl Parser {
525
517
}
526
518
}
527
519
528
- impl Parser {
520
+ impl < T : iterator :: Iterator < char > > Parser < T > {
529
521
fn eof ( & self ) -> bool { self . ch == -1 as char }
530
522
531
523
fn bump ( & mut self ) {
532
- if self . eof ( ) {
533
- return ;
534
- }
535
-
536
- self . col += 1 u;
537
-
538
- if self . buf_idx >= self . buf . len ( ) {
539
- self . buf = self . rdr . read_chars ( BUF_SIZE ) ;
540
- if self . buf . len ( ) == 0 {
541
- self . ch = -1 as char ;
542
- return ;
543
- }
544
- self . buf_idx = 0 ;
524
+ match self . rdr . next ( ) {
525
+ Some ( ch) => self . ch = ch,
526
+ None ( ) => self . ch = -1 as char ,
545
527
}
546
- self . ch = self . buf [ self . buf_idx ] ;
547
- self . buf_idx += 1 ;
548
528
549
529
if self . ch == '\n' {
550
530
self . line += 1 u;
551
531
self . col = 1 u;
532
+ } else {
533
+ self . col += 1 u;
552
534
}
553
535
}
554
536
@@ -583,7 +565,10 @@ impl Parser {
583
565
}
584
566
585
567
fn parse_whitespace( & mut self) {
586
- while char:: is_whitespace ( self . ch ) { self . bump ( ) ; }
568
+ while self . ch == ' ' ||
569
+ self . ch == '\n' ||
570
+ self . ch == '\t' ||
571
+ self . ch == '\r' { self . bump ( ) ; }
587
572
}
588
573
589
574
fn parse_ident ( & mut self , ident : & str , value : Json ) -> Result < Json , Error > {
@@ -727,8 +712,11 @@ impl Parser {
727
712
let mut escape = false ;
728
713
let mut res = ~"";
729
714
730
- while ! self . eof ( ) {
715
+ loop {
731
716
self . bump ( ) ;
717
+ if self . eof ( ) {
718
+ return self . error ( ~"EOF while parsing string") ;
719
+ }
732
720
733
721
if ( escape) {
734
722
match self . ch {
@@ -783,8 +771,6 @@ impl Parser {
783
771
res. push_char ( self . ch ) ;
784
772
}
785
773
}
786
-
787
- self . error ( ~"EOF while parsing string")
788
774
}
789
775
790
776
fn parse_list( & mut self) -> Result <Json , Error > {
@@ -870,15 +856,15 @@ impl Parser {
870
856
871
857
/// Decodes a json value from an @io::Reader
872
858
pub fn from_reader ( rdr : @io:: Reader ) -> Result < Json , Error > {
873
- let mut parser = Parser ( rdr) ;
859
+ let s = str:: from_bytes ( rdr. read_whole_stream ( ) ) ;
860
+ let mut parser = Parser ( ~s. iter ( ) ) ;
874
861
parser. parse ( )
875
862
}
876
863
877
864
/// Decodes a json value from a string
878
865
pub fn from_str ( s : & str ) -> Result < Json , Error > {
879
- do io:: with_str_reader ( s) |rdr| {
880
- from_reader ( rdr)
881
- }
866
+ let mut parser = Parser ( ~s. iter ( ) ) ;
867
+ parser. parse ( )
882
868
}
883
869
884
870
/// A structure to decode JSON to values in rust.
@@ -1744,7 +1730,7 @@ mod tests {
1744
1730
assert_eq!(v, 0.4e-01f);
1745
1731
}
1746
1732
1747
- // FIXME: #7611: xfailed for now
1733
+ #[test]
1748
1734
fn test_read_str() {
1749
1735
assert_eq!(from_str("\" " ) ,
1750
1736
Err ( Error { line: 1 u, col: 2 u, msg: @~"EOF while parsing string"
0 commit comments