1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
extern crate serde_json;
use context::Context;
use futures::{future, Future};
use holochain_core_types::{
cas::{content::Address, storage::ContentAddressableStorage},
entry::Entry,
error::HolochainError,
};
use std::sync::Arc;
fn get_entry_from_dht_cas(
context: &Arc<Context>,
address: Address,
) -> Result<Option<Entry>, HolochainError> {
let dht = context.state().unwrap().dht().content_storage();
dht.fetch(&address)
}
pub fn get_entry(
context: &Arc<Context>,
address: Address,
) -> Box<dyn Future<Item = Option<Entry>, Error = HolochainError>> {
match get_entry_from_dht_cas(context, address) {
Err(err) => Box::new(future::err(err)),
Ok(result) => Box::new(future::ok(result)),
}
}
#[cfg(test)]
pub mod tests {
use futures::executor::block_on;
use holochain_core_types::{
cas::{content::AddressableContent, storage::ContentAddressableStorage},
entry::test_entry,
};
use instance::tests::test_context_with_state;
#[test]
fn get_entry_from_dht_cas() {
let entry = test_entry();
let context = test_context_with_state();
let result = super::get_entry_from_dht_cas(&context, entry.address());
assert_eq!(Ok(None), result);
context
.state()
.unwrap()
.dht()
.content_storage()
.add(&entry)
.unwrap();
let result = super::get_entry_from_dht_cas(&context, entry.address());
assert_eq!(Ok(Some(entry.clone())), result);
}
#[test]
fn get_entry_from_dht_cas_futures() {
let entry = test_entry();
let context = test_context_with_state();
let future = super::get_entry(&context, entry.address());
assert_eq!(Ok(None), block_on(future));
context
.state()
.unwrap()
.dht()
.content_storage()
.add(&entry)
.unwrap();
let future = super::get_entry(&context, entry.address());
assert_eq!(Ok(Some(entry.clone())), block_on(future));
}
}