Skip to content

Commit 4b4cc67

Browse files
saghmzonyitoo
authored andcommitted
add entry API for Document (#87)
1 parent 2d8a66d commit 4b4cc67

File tree

3 files changed

+60
-1
lines changed

3 files changed

+60
-1
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ rust-crypto = "0.2"
2323
serde = "1.0"
2424
serde_json = { version = "1.0.0", features = ["preserve_order"] }
2525
time = "0.1"
26-
linked-hash-map = "0.3"
26+
linked-hash-map = "0.5"
2727
hostname = "^0.1"
2828
hex = "^0.2"
2929

src/ordered.rs

+24
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,30 @@ impl OrderedDocument {
354354
pub fn remove(&mut self, key: &str) -> Option<Bson> {
355355
self.inner.remove(key)
356356
}
357+
358+
pub fn entry(&mut self, k: String) -> Entry {
359+
Entry {
360+
inner: self.inner.entry(k),
361+
}
362+
}
363+
}
364+
365+
pub struct Entry<'a> {
366+
inner: linked_hash_map::Entry<'a, String, Bson>,
367+
}
368+
369+
impl<'a> Entry<'a> {
370+
pub fn key(&self) -> &str {
371+
self.inner.key()
372+
}
373+
374+
pub fn or_insert(self, default: Bson) -> &'a mut Bson {
375+
self.inner.or_insert(default)
376+
}
377+
378+
pub fn or_insert_with<F: FnOnce() -> Bson>(self, default: F) -> &'a mut Bson {
379+
self.inner.or_insert_with(default)
380+
}
357381
}
358382

359383
impl From<LinkedHashMap<String, Bson>> for OrderedDocument {

tests/modules/ordered.rs

+35
Original file line numberDiff line numberDiff line change
@@ -121,3 +121,38 @@ fn remove() {
121121
let keys: Vec<_> = doc.iter().map(|(key, _)| key.to_owned()).collect();
122122
assert_eq!(expected_keys, keys);
123123
}
124+
125+
#[test]
126+
fn entry() {
127+
let mut doc = doc! {
128+
"first": 1i32,
129+
"second": "foo",
130+
"alphanumeric": "bar",
131+
};
132+
133+
{
134+
let first_entry = doc.entry("first".to_owned());
135+
assert_eq!(first_entry.key(), "first");
136+
137+
let v = first_entry.or_insert_with(|| Bson::TimeStamp(27));
138+
assert_eq!(v, &mut Bson::I32(1));
139+
}
140+
141+
{
142+
let fourth_entry = doc.entry("fourth".to_owned());
143+
assert_eq!(fourth_entry.key(), "fourth");
144+
145+
let v = fourth_entry.or_insert(Bson::Null);
146+
assert_eq!(v, &mut Bson::Null);
147+
}
148+
149+
assert_eq!(
150+
doc,
151+
doc! {
152+
"first": 1i32,
153+
"second": "foo",
154+
"alphanumeric": "bar",
155+
"fourth": Bson::Null,
156+
},
157+
);
158+
}

0 commit comments

Comments
 (0)