Skip to content

Commit 2a57273

Browse files
authored
Merge pull request #164 from maciejhirsz/v0.12.0
v0.12.0
2 parents 14bfab1 + bd429cc commit 2a57273

File tree

11 files changed

+147
-169
lines changed

11 files changed

+147
-169
lines changed

Cargo.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
[package]
22
name = "json"
3-
version = "0.11.15"
3+
version = "0.12.0"
44
authors = ["Maciej Hirsz <[email protected]>"]
55
description = "JSON implementation in Rust"
66
repository = "https://github.com/maciejhirsz/json-rust"
77
documentation = "https://docs.rs/json/"
88
license = "MIT/Apache-2.0"
9+
edition = "2018"

src/codegen.rs

+33-33
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use std::ptr;
22
use std::io::Write;
3-
use JsonValue;
4-
use number::Number;
5-
use object::Object;
63
use std::io;
74

8-
use util::print_dec;
5+
use crate::JsonValue;
6+
use crate::number::Number;
7+
use crate::object::Object;
8+
use crate::util::print_dec;
99

1010
const QU: u8 = b'"';
1111
const BS: u8 = b'\\';
@@ -66,35 +66,35 @@ pub trait Generator {
6666

6767
#[inline(never)]
6868
fn write_string_complex(&mut self, string: &str, mut start: usize) -> io::Result<()> {
69-
try!(self.write(string[ .. start].as_bytes()));
69+
self.write(string[ .. start].as_bytes())?;
7070

7171
for (index, ch) in string.bytes().enumerate().skip(start) {
7272
let escape = ESCAPED[ch as usize];
7373
if escape > 0 {
74-
try!(self.write(string[start .. index].as_bytes()));
75-
try!(self.write(&[b'\\', escape]));
74+
self.write(string[start .. index].as_bytes())?;
75+
self.write(&[b'\\', escape])?;
7676
start = index + 1;
7777
}
7878
if escape == b'u' {
79-
try!(write!(self.get_writer(), "{:04x}", ch));
79+
write!(self.get_writer(), "{:04x}", ch)?;
8080
}
8181
}
82-
try!(self.write(string[start ..].as_bytes()));
82+
self.write(string[start ..].as_bytes())?;
8383

8484
self.write_char(b'"')
8585
}
8686

8787
#[inline(always)]
8888
fn write_string(&mut self, string: &str) -> io::Result<()> {
89-
try!(self.write_char(b'"'));
89+
self.write_char(b'"')?;
9090

9191
for (index, ch) in string.bytes().enumerate() {
9292
if ESCAPED[ch as usize] > 0 {
9393
return self.write_string_complex(string, index)
9494
}
9595
}
9696

97-
try!(self.write(string.as_bytes()));
97+
self.write(string.as_bytes())?;
9898
self.write_char(b'"')
9999
}
100100

@@ -116,30 +116,30 @@ pub trait Generator {
116116

117117
#[inline(always)]
118118
fn write_object(&mut self, object: &Object) -> io::Result<()> {
119-
try!(self.write_char(b'{'));
119+
self.write_char(b'{')?;
120120
let mut iter = object.iter();
121121

122122
if let Some((key, value)) = iter.next() {
123123
self.indent();
124-
try!(self.new_line());
125-
try!(self.write_string(key));
126-
try!(self.write_min(b": ", b':'));
127-
try!(self.write_json(value));
124+
self.new_line()?;
125+
self.write_string(key)?;
126+
self.write_min(b": ", b':')?;
127+
self.write_json(value)?;
128128
} else {
129-
try!(self.write_char(b'}'));
129+
self.write_char(b'}')?;
130130
return Ok(());
131131
}
132132

133133
for (key, value) in iter {
134-
try!(self.write_char(b','));
135-
try!(self.new_line());
136-
try!(self.write_string(key));
137-
try!(self.write_min(b": ", b':'));
138-
try!(self.write_json(value));
134+
self.write_char(b',')?;
135+
self.new_line()?;
136+
self.write_string(key)?;
137+
self.write_min(b": ", b':')?;
138+
self.write_json(value)?;
139139
}
140140

141141
self.dedent();
142-
try!(self.new_line());
142+
self.new_line()?;
143143
self.write_char(b'}')
144144
}
145145

@@ -152,26 +152,26 @@ pub trait Generator {
152152
JsonValue::Boolean(true) => self.write(b"true"),
153153
JsonValue::Boolean(false) => self.write(b"false"),
154154
JsonValue::Array(ref array) => {
155-
try!(self.write_char(b'['));
155+
self.write_char(b'[')?;
156156
let mut iter = array.iter();
157157

158158
if let Some(item) = iter.next() {
159159
self.indent();
160-
try!(self.new_line());
161-
try!(self.write_json(item));
160+
self.new_line()?;
161+
self.write_json(item)?;
162162
} else {
163-
try!(self.write_char(b']'));
163+
self.write_char(b']')?;
164164
return Ok(());
165165
}
166166

167167
for item in iter {
168-
try!(self.write_char(b','));
169-
try!(self.new_line());
170-
try!(self.write_json(item));
168+
self.write_char(b',')?;
169+
self.new_line()?;
170+
self.write_json(item)?;
171171
}
172172

173173
self.dedent();
174-
try!(self.new_line());
174+
self.new_line()?;
175175
self.write_char(b']')
176176
},
177177
JsonValue::Object(ref object) => {
@@ -345,9 +345,9 @@ impl<'a, W> Generator for PrettyWriterGenerator<'a, W> where W: Write {
345345
}
346346

347347
fn new_line(&mut self) -> io::Result<()> {
348-
try!(self.write_char(b'\n'));
348+
self.write_char(b'\n')?;
349349
for _ in 0..(self.dent * self.spaces_per_indent) {
350-
try!(self.write_char(b' '));
350+
self.write_char(b' ')?;
351351
}
352352
Ok(())
353353
}

src/lib.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ pub mod iterators {
237237
pub use Error as JsonError;
238238

239239
#[deprecated(since="0.9.0", note="use `json::Result` instead")]
240-
pub use Result as JsonResult;
240+
pub use crate::Result as JsonResult;
241241

242242
pub use parser::parse;
243243

@@ -280,7 +280,8 @@ macro_rules! array {
280280
[] => ($crate::JsonValue::new_array());
281281

282282
[ $( $item:expr ),* ] => ({
283-
let mut array = Vec::new();
283+
let size = 0 $( + {let _ = $item; 1} )*;
284+
let mut array = Vec::with_capacity(size);
284285

285286
$(
286287
array.push($item.into());
@@ -326,7 +327,8 @@ macro_rules! object {
326327
{ $( $key:expr => $value:expr, )* } => ({
327328
use $crate::object::Object;
328329

329-
let mut object = Object::new();
330+
let size = 0 $( + {let _ = $key; 1} )*;
331+
let mut object = Object::with_capacity(size);
330332

331333
$(
332334
object.insert($key, $value.into());

src/number.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::{ ops, fmt, f32, f64 };
22
use std::num::FpCategory;
3-
use util::grisu2;
4-
use util::print_dec;
3+
use crate::util::grisu2;
4+
use crate::util::print_dec;
55

66
/// NaN value represented in `Number` type. NaN is equal to itself.
77
pub const NAN: Number = Number {

src/object.rs

+16-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use std::{ ptr, mem, str, slice, fmt };
22
use std::ops::{ Index, IndexMut, Deref };
3+
use std::iter::FromIterator;
34

4-
use codegen::{ DumpGenerator, Generator, PrettyGenerator };
5-
use value::JsonValue;
5+
use crate::codegen::{ DumpGenerator, Generator, PrettyGenerator };
6+
use crate::value::JsonValue;
67

78
const KEY_BUF_LEN: usize = 32;
89
static NULL: JsonValue = JsonValue::Null;
@@ -539,6 +540,19 @@ impl Clone for Object {
539540
}
540541
}
541542

543+
impl<K: AsRef<str>, V: Into<JsonValue>> FromIterator<(K, V)> for Object {
544+
fn from_iter<I: IntoIterator<Item=(K, V)>>(iter: I) -> Self {
545+
let iter = iter.into_iter();
546+
let mut object = Object::with_capacity(iter.size_hint().0);
547+
548+
for (key, value) in iter {
549+
object.insert(key.as_ref(), value.into());
550+
}
551+
552+
object
553+
}
554+
}
555+
542556
// Because keys can inserted in different order, the safe way to
543557
// compare `Object`s is to iterate over one and check if the other
544558
// has all the same keys.

0 commit comments

Comments
 (0)