Skip to content

Commit fc51639

Browse files
committed
Return empty iterators, again #64
1 parent 40b0c6f commit fc51639

File tree

3 files changed

+46
-38
lines changed

3 files changed

+46
-38
lines changed

src/object.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,15 @@ pub struct Iter<'a> {
500500
inner: slice::Iter<'a, Node>
501501
}
502502

503+
impl<'a> Iter<'a> {
504+
/// Create an empty iterator that always returns `None`
505+
pub fn empty() -> Self {
506+
Iter {
507+
inner: [].iter()
508+
}
509+
}
510+
}
511+
503512
impl<'a> Iterator for Iter<'a> {
504513
type Item = (&'a str, &'a JsonValue);
505514

@@ -520,6 +529,15 @@ pub struct IterMut<'a> {
520529
inner: slice::IterMut<'a, Node>
521530
}
522531

532+
impl<'a> IterMut<'a> {
533+
/// Create an empty iterator that always returns `None`
534+
pub fn empty() -> Self {
535+
IterMut {
536+
inner: [].iter_mut()
537+
}
538+
}
539+
}
540+
523541
impl<'a> Iterator for IterMut<'a> {
524542
type Item = (&'a str, &'a mut JsonValue);
525543

src/value.rs

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -287,43 +287,47 @@ impl JsonValue {
287287
}
288288

289289
/// Works on `JsonValue::Array` - returns an iterator over members.
290-
pub fn members(&self) -> Option<Members> {
290+
/// Will return an empty iterator if called on non-array types.
291+
pub fn members(&self) -> Members {
291292
match *self {
292293
JsonValue::Array(ref vec) => {
293-
Some(vec.iter())
294+
vec.iter()
294295
},
295-
_ => None
296+
_ => [].iter()
296297
}
297298
}
298299

299300
/// Works on `JsonValue::Array` - returns a mutable iterator over members.
300-
pub fn members_mut(&mut self) -> Option<MembersMut> {
301+
/// Will return an empty iterator if called on non-array types.
302+
pub fn members_mut(&mut self) -> MembersMut {
301303
match *self {
302304
JsonValue::Array(ref mut vec) => {
303-
Some(vec.iter_mut())
305+
vec.iter_mut()
304306
},
305-
_ => None
307+
_ => [].iter_mut()
306308
}
307309
}
308310

309311
/// Works on `JsonValue::Object` - returns an iterator over key value pairs.
310-
pub fn entries(&self) -> Option<Entries> {
312+
/// Will return an empty iterator if called on non-object types.
313+
pub fn entries(&self) -> Entries {
311314
match *self {
312315
JsonValue::Object(ref object) => {
313-
Some(object.iter())
316+
object.iter()
314317
},
315-
_ => None
318+
_ => Entries::empty()
316319
}
317320
}
318321

319322
/// Works on `JsonValue::Object` - returns a mutable iterator over
320323
/// key value pairs.
321-
pub fn entries_mut(&mut self) -> Option<EntriesMut> {
324+
/// Will return an empty iterator if called on non-object types.
325+
pub fn entries_mut(&mut self) -> EntriesMut {
322326
match *self {
323327
JsonValue::Object(ref mut object) => {
324-
Some(object.iter_mut())
328+
object.iter_mut()
325329
},
326-
_ => None
330+
_ => EntriesMut::empty()
327331
}
328332
}
329333

@@ -502,17 +506,3 @@ impl<'a> IndexMut<&'a String> for JsonValue {
502506
self.index_mut(index.deref())
503507
}
504508
}
505-
506-
impl IntoIterator for JsonValue {
507-
type Item = JsonValue;
508-
type IntoIter = ::std::vec::IntoIter<JsonValue>;
509-
510-
fn into_iter(self) -> Self::IntoIter {
511-
match self {
512-
JsonValue::Array(vec) => {
513-
vec.into_iter()
514-
},
515-
_ => Vec::new().into_iter()
516-
}
517-
}
518-
}

tests/lib.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -632,11 +632,11 @@ mod unit {
632632
fn array_members() {
633633
let data = array![1, "foo"];
634634

635-
for member in data.members().unwrap() {
635+
for member in data.members() {
636636
assert!(!member.is_null());
637637
}
638638

639-
let mut members = data.members().unwrap();
639+
let mut members = data.members();
640640

641641
assert_eq!(members.next().unwrap(), 1);
642642
assert_eq!(members.next().unwrap(), "foo");
@@ -647,11 +647,11 @@ mod unit {
647647
fn array_members_rev() {
648648
let data = array![1, "foo"];
649649

650-
for member in data.members().unwrap() {
650+
for member in data.members() {
651651
assert!(!member.is_null());
652652
}
653653

654-
let mut members = data.members().unwrap().rev();
654+
let mut members = data.members().rev();
655655

656656
assert_eq!(members.next().unwrap(), "foo");
657657
assert_eq!(members.next().unwrap(), 1);
@@ -662,7 +662,7 @@ mod unit {
662662
fn array_members_mut() {
663663
let mut data = array![Null, Null];
664664

665-
for member in data.members_mut().unwrap() {
665+
for member in data.members_mut() {
666666
assert!(member.is_null());
667667
*member = 100.into();
668668
}
@@ -675,7 +675,7 @@ mod unit {
675675
let mut data = array![Null, Null];
676676
let mut item = 100;
677677

678-
for member in data.members_mut().unwrap().rev() {
678+
for member in data.members_mut().rev() {
679679
assert!(member.is_null());
680680
*member = item.into();
681681
item += 1;
@@ -712,11 +712,11 @@ mod unit {
712712
"b" => "foo"
713713
};
714714

715-
for (_, value) in data.entries().unwrap() {
715+
for (_, value) in data.entries() {
716716
assert!(!value.is_null());
717717
}
718718

719-
let mut entries = data.entries().unwrap();
719+
let mut entries = data.entries();
720720

721721
let (key, value) = entries.next().unwrap();
722722
assert_eq!(key, "a");
@@ -736,11 +736,11 @@ mod unit {
736736
"b" => "foo"
737737
};
738738

739-
for (_, value) in data.entries().unwrap().rev() {
739+
for (_, value) in data.entries().rev() {
740740
assert!(!value.is_null());
741741
}
742742

743-
let mut entries = data.entries().unwrap().rev();
743+
let mut entries = data.entries().rev();
744744

745745
let (key, value) = entries.next().unwrap();
746746
assert_eq!(key, "b");
@@ -760,7 +760,7 @@ mod unit {
760760
"b" => Null
761761
};
762762

763-
for (_, value) in data.entries_mut().unwrap() {
763+
for (_, value) in data.entries_mut() {
764764
assert!(value.is_null());
765765
*value = 100.into();
766766
}
@@ -779,7 +779,7 @@ mod unit {
779779
};
780780
let mut item = 100;
781781

782-
for (_, value) in data.entries_mut().unwrap().rev() {
782+
for (_, value) in data.entries_mut().rev() {
783783
assert!(value.is_null());
784784
*value = item.into();
785785
item += 1;

0 commit comments

Comments
 (0)