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
use holochain_core_types::entry_type::EntryType;
use holochain_wasm_utils::api_serialization::{QueryArgs, QueryResult};
use nucleus::ribosome::Runtime;
use serde_json;
use std::str::FromStr;
use wasmi::{RuntimeArgs, RuntimeValue, Trap};
pub fn invoke_query(
runtime: &mut Runtime,
args: &RuntimeArgs,
) -> Result<Option<RuntimeValue>, Trap> {
let args_str = runtime.load_utf8_from_args(&args);
let input: QueryArgs = match serde_json::from_str(&args_str) {
Ok(input) => input,
Err(_) => return ribosome_error_code!(ArgumentDeserializationFailed),
};
let maybe_entry_type = EntryType::from_str(&input.entry_type_name);
if maybe_entry_type.is_err() {
return ribosome_error_code!(UnknownEntryType);
}
let entry_type = maybe_entry_type.unwrap();
let agent = runtime.context.state().unwrap().agent();
let top = agent
.top_chain_header()
.expect("Should have genesis entries.");
let result = agent.chain().query(&Some(top), entry_type, input.limit);
let query_result = QueryResult { hashes: result };
let json = serde_json::to_string(&query_result).expect("Could not serialize QueryResult");
runtime.store_utf8(&json)
}