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
extern crate serde_json;
use context::Context;
use holochain_core_types::{entry_type::EntryType, error::HolochainError};
use nucleus::{
    ribosome::{
        self,
        callback::{get_dna, get_wasm, CallbackResult},
    },
    ZomeFnCall,
};
use std::sync::Arc;

pub fn get_validation_package_definition(
    entry_type: EntryType,
    context: Arc<Context>,
) -> Result<CallbackResult, HolochainError> {
    match entry_type {
        EntryType::App(app_entry_type) => {
            let dna = get_dna(&context).expect("Callback called without DNA set!");
            let zome_name = dna.get_zome_name_for_entry_type(&app_entry_type);
            if zome_name.is_none() {
                return Ok(CallbackResult::NotImplemented);
            }

            let zome_name = zome_name.unwrap();
            let wasm = get_wasm(&context, &zome_name)
                .ok_or(HolochainError::ErrorGeneric(String::from("no wasm found")))?;

            let result = ribosome::run_dna(
                &dna.name.clone(),
                context,
                wasm.code.clone(),
                &ZomeFnCall::new(
                    &zome_name,
                    "no capability, since this is an entry validation call",
                    "__hdk_get_validation_package_for_entry_type",
                    &app_entry_type,
                ),
                Some(app_entry_type.into_bytes()),
            )?;

            if result.is_empty() {
                Err(HolochainError::SerializationError(String::from(
                    "__hdk_get_validation_package_for_entry_type returned empty result",
                )))
            } else {
                match serde_json::from_str(&result) {
                    Ok(package) => Ok(CallbackResult::ValidationPackageDefinition(package)),
                    Err(_) => Err(HolochainError::SerializationError(String::from(
                        "validation_package result could not be deserialized as ValidationPackage",
                    ))),
                }
            }
        }
        _ => Err(HolochainError::NotImplemented),
    }
}