#[doc(hidden)]
#[macro_export]
macro_rules! load_json {
($encoded_allocation_of_input:ident) => {{
let maybe_input = $crate::holochain_wasm_utils::memory::ribosome::load_ribosome_encoded_json(
$encoded_allocation_of_input,
);
match maybe_input {
Ok(input) => input,
Err(hc_err) => return $crate::holochain_wasm_utils::memory::ribosome::return_code_for_allocation_result(
$crate::global_fns::write_json(hc_err)
).into(),
}
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! load_string {
($encoded_allocation_of_input:ident) => {{
let maybe_input = $crate::holochain_wasm_utils::memory::ribosome::load_ribosome_encoded_string(
$encoded_allocation_of_input,
);
match maybe_input {
Ok(input) => input,
Err(hc_err) => return $crate::holochain_wasm_utils::memory::ribosome::return_code_for_allocation_result(
$crate::global_fns::write_json(hc_err)
).into(),
}
}};
}
#[macro_export]
macro_rules! define_zome {
(
entries : [
$( $entry_expr:expr ),*
]
init : || {
$init_expr:expr
}
validate_agent: |$agent_validation_param:ident : EntryValidationData::<AgentId>| {
$agent_validation_expr:expr
}
$(
receive : |$receive_from:ident, $receive_param:ident| {
$receive_expr:expr
}
)*
functions : [
$(
$zome_function_name:ident : {
inputs: | $( $input_param_name:ident : $input_param_type:ty ),* |,
outputs: | $( $output_param_name:ident : $output_param_type:ty ),* |,
handler: $handler_path:path
}
)*
]
traits : {
$(
$trait:ident [
$($trait_fn:ident),*
]
)*
}
) => {
#[no_mangle]
#[allow(unused_variables)]
pub extern "C" fn zome_setup(zd: &mut $crate::meta::ZomeDefinition) {
$(
zd.define($entry_expr);
)*
let validator = Box::new(|validation_data: hdk::holochain_wasm_utils::holochain_core_types::validation::EntryValidationData<hdk::holochain_core_types::agent::AgentId>| {
let $agent_validation_param = validation_data;
$agent_validation_expr
});
zd.define_agent_validator(validator);
}
#[no_mangle]
pub extern "C" fn init(encoded_allocation_of_input: hdk::holochain_core_types::error::RibosomeEncodingBits) -> hdk::holochain_core_types::error::RibosomeEncodingBits {
let maybe_allocation = $crate::holochain_wasm_utils::memory::allocation::WasmAllocation::try_from_ribosome_encoding(encoded_allocation_of_input);
let allocation = match maybe_allocation {
Ok(allocation) => allocation,
Err(allocation_error) => return hdk::holochain_core_types::error::RibosomeEncodedValue::from(allocation_error).into(),
};
let init = $crate::global_fns::init_global_memory(allocation);
if init.is_err() {
return $crate::holochain_wasm_utils::memory::ribosome::return_code_for_allocation_result(
init
).into();
}
fn execute() -> Result<(), String> {
$init_expr
}
match execute() {
Ok(_) => hdk::holochain_core_types::error::RibosomeEncodedValue::Success.into(),
Err(e) => $crate::holochain_wasm_utils::memory::ribosome::return_code_for_allocation_result(
$crate::global_fns::write_json(
$crate::holochain_wasm_utils::holochain_json_api::json::RawString::from(e)
)
).into(),
}
}
$(
#[no_mangle]
pub extern "C" fn receive(encoded_allocation_of_input: hdk::holochain_core_types::error::RibosomeEncodingBits) -> hdk::holochain_core_types::error::RibosomeEncodingBits {
let maybe_allocation = $crate::holochain_wasm_utils::memory::allocation::WasmAllocation::try_from_ribosome_encoding(encoded_allocation_of_input);
let allocation = match maybe_allocation {
Ok(allocation) => allocation,
Err(allocation_error) => return hdk::holochain_core_types::error::RibosomeEncodedValue::from(allocation_error).into(),
};
let init = $crate::global_fns::init_global_memory(allocation);
if init.is_err() {
return $crate::holochain_wasm_utils::memory::ribosome::return_code_for_allocation_result(
init
).into();
}
let input = load_json!(encoded_allocation_of_input);
fn execute(input: $crate::holochain_wasm_utils::api_serialization::receive::ReceiveParams ) -> String {
let $receive_param = input.payload;
let $receive_from = input.from;
$receive_expr
}
$crate::holochain_wasm_utils::memory::ribosome::return_code_for_allocation_result(
$crate::global_fns::write_json(
JsonString::from_json(&execute(input))
)
).into()
}
)*
use std::collections::HashMap;
#[no_mangle]
#[allow(unused_imports)]
pub fn __list_traits() -> $crate::holochain_core_types::dna::zome::ZomeTraits {
use $crate::holochain_core_types::dna::{
fn_declarations::{FnParameter, FnDeclaration, TraitFns},
};
use std::collections::BTreeMap;
let return_value: $crate::holochain_core_types::dna::zome::ZomeTraits = {
let mut traitfns_map = BTreeMap::new();
$(
{
let mut traitfns = TraitFns::new();
traitfns.functions = vec![
$(
stringify!($trait_fn).into()
),*
];
traitfns_map.insert(stringify!($trait).into(), traitfns);
}
),*
traitfns_map
};
return_value
}
#[no_mangle]
#[allow(unused_imports)]
pub fn __list_functions() -> $crate::holochain_core_types::dna::zome::ZomeFnDeclarations {
use $crate::holochain_core_types::dna::fn_declarations::{FnParameter, FnDeclaration};
let return_value: $crate::holochain_core_types::dna::zome::ZomeFnDeclarations = {
vec![
$(
FnDeclaration {
name: stringify!($zome_function_name).into(),
inputs: vec![
$(
FnParameter::new(stringify!($input_param_name), stringify!($input_param_type))
),*
],
outputs: vec![
$(
FnParameter::new(stringify!($output_param_name), stringify!($output_param_type))
),*
]
}
),*
]
};
return_value
}
#[no_mangle]
pub extern "C" fn __install_panic_handler() -> () {
use $crate::{api::debug, holochain_json_api::json::RawString};
use std::panic;
panic::set_hook(Box::new(move |info| {
let _ = debug(RawString::from(
info.payload().downcast_ref::<String>().unwrap().clone(),
));
let _ = if let Some(location) = info.location() {
debug(RawString::from(format!(
"panic occurred in file '{}' at line {}",
location.file(),
location.line()
)))
} else {
debug(RawString::from(format!(
"panic occurred but can't get location information..."
)))
};
}));
}
$(
#[no_mangle]
pub extern "C" fn $zome_function_name(encoded_allocation_of_input: hdk::holochain_core_types::error::RibosomeEncodingBits) -> hdk::holochain_core_types::error::RibosomeEncodingBits {
let maybe_allocation = $crate::holochain_wasm_utils::memory::allocation::WasmAllocation::try_from_ribosome_encoding(encoded_allocation_of_input);
let allocation = match maybe_allocation {
Ok(allocation) => allocation,
Err(allocation_error) => return hdk::holochain_core_types::error::RibosomeEncodedValue::from(allocation_error).into(),
};
let init = $crate::global_fns::init_global_memory(allocation);
if init.is_err() {
return $crate::holochain_wasm_utils::memory::ribosome::return_code_for_allocation_result(
init
).into();
}
#[derive(Deserialize, Serialize, Debug, $crate::holochain_json_derive::DefaultJson)]
struct InputStruct {
$($input_param_name : $input_param_type),*
}
let input: InputStruct = load_json!(encoded_allocation_of_input);
fn execute (params: InputStruct) -> $( $output_param_type )* {
let InputStruct { $($input_param_name),* } = params;
$handler_path($($input_param_name),*)
}
$crate::holochain_wasm_utils::memory::ribosome::return_code_for_allocation_result(
$crate::global_fns::write_json(execute(input))
).into()
}
)*
};
}