use super::{CallContext, Ribosome};
use holochain_cascade::CascadeImpl;
use holochain_types::prelude::*;
use holochain_wasmer_host::prelude::*;
use std::sync::Arc;
const DEF_REF_SIZE: usize = 32;
pub(crate) trait KeyRefExt: Sized {
fn to_tag(&self) -> Arc<str>;
}
impl KeyRefExt for XSalsa20Poly1305KeyRef {
fn to_tag(&self) -> Arc<str> {
let tag = subtle_encoding::base64::encode(self);
let tag = unsafe { String::from_utf8_unchecked(tag) };
tag.into_boxed_str().into()
}
}
pub struct HostFnApi {
ribosome: Arc<Ribosome>,
call_context: Arc<CallContext>,
}
impl HostFnApi {
pub fn new(ribosome: Arc<Ribosome>, call_context: Arc<CallContext>) -> Self {
Self {
ribosome,
call_context,
}
}
}
macro_rules! host_fn_api_impls {
( $( $(#[cfg(feature = $feat:literal)])? fn $f:ident ( $input:ty ) -> $output:ty; )* ) => {
$(
$(#[cfg(feature = $feat)])?
pub(crate) mod $f;
)*
impl HostFnApiT for HostFnApi {
$(
$(#[cfg(feature = $feat)])?
fn $f(&self, input: $input) -> Result<$output, HostFnApiError> {
$f::$f(
self.ribosome.clone(),
self.call_context.clone(),
input.into()
).map_err(|e| HostFnApiError::RibosomeError(Box::new(e)))
}
)*
}
};
}
pub fn cascade_from_call_context(call_context: &CallContext) -> CascadeImpl {
CascadeImpl::from_workspace_and_network(
&call_context.host_context.workspace(),
call_context.host_context.network().clone(),
)
.with_zome_call_origin(call_context.zome.zome_name(), call_context.function_name())
}
use holochain_zome_types as zt;
host_fn_api_impls! {
#[cfg(feature = "unstable-countersigning")]
fn accept_countersigning_preflight_request(zt::prelude::PreflightRequest) -> zt::prelude::PreflightRequestAcceptance;
fn agent_info (()) -> zt::prelude::AgentInfo;
fn dna_info_1 (()) -> zt::prelude::DnaInfoV1;
fn dna_info_2 (()) -> zt::prelude::DnaInfoV2;
fn call_info (()) -> zt::prelude::CallInfo;
fn call (Vec<zt::prelude::Call>) -> Vec<zt::prelude::ZomeCallResponse>;
fn capability_claims (()) -> ();
fn capability_grants (()) -> ();
fn capability_info (()) -> ();
fn create (zt::prelude::CreateInput) -> holo_hash::ActionHash;
fn x_salsa20_poly1305_shared_secret_create_random(
Option<zt::prelude::XSalsa20Poly1305KeyRef>
) -> zt::prelude::XSalsa20Poly1305KeyRef;
fn x_salsa20_poly1305_shared_secret_export(
zt::prelude::XSalsa20Poly1305SharedSecretExport
) -> zt::prelude::XSalsa20Poly1305EncryptedData;
fn x_salsa20_poly1305_shared_secret_ingest(
zt::prelude::XSalsa20Poly1305SharedSecretIngest
) -> zt::prelude::XSalsa20Poly1305KeyRef;
fn x_salsa20_poly1305_encrypt(
zt::prelude::XSalsa20Poly1305Encrypt
) -> zt::prelude::XSalsa20Poly1305EncryptedData;
fn x_salsa20_poly1305_decrypt(
zt::prelude::XSalsa20Poly1305Decrypt
) -> Option<zt::prelude::XSalsa20Poly1305Data>;
fn create_x25519_keypair(()) -> zt::prelude::X25519PubKey;
fn x_25519_x_salsa20_poly1305_encrypt (zt::prelude::X25519XSalsa20Poly1305Encrypt) -> zt::prelude::XSalsa20Poly1305EncryptedData;
fn x_25519_x_salsa20_poly1305_decrypt (zt::prelude::X25519XSalsa20Poly1305Decrypt) -> Option<zt::prelude::XSalsa20Poly1305Data>;
fn ed_25519_x_salsa20_poly1305_encrypt (zt::prelude::Ed25519XSalsa20Poly1305Encrypt) -> zt::prelude::XSalsa20Poly1305EncryptedData;
fn ed_25519_x_salsa20_poly1305_decrypt (zt::prelude::Ed25519XSalsa20Poly1305Decrypt) -> zt::prelude::XSalsa20Poly1305Data;
fn create_link (zt::prelude::CreateLinkInput) -> holo_hash::ActionHash;
fn delete (zt::prelude::DeleteInput) -> holo_hash::ActionHash;
fn delete_link (zt::prelude::DeleteLinkInput) -> holo_hash::ActionHash;
fn emit_signal (zt::prelude::AppSignal) -> ();
fn trace (zt::prelude::TraceMsg) -> ();
fn get (Vec<zt::prelude::GetInput>) -> Vec<Option<zt::prelude::Record>>;
fn get_agent_activity (zt::prelude::GetAgentActivityInput) -> zt::prelude::AgentActivityStatus;
fn get_details (Vec<zt::prelude::GetInput>) -> Vec<Option<zt::prelude::Details>>;
fn get_links (Vec<zt::prelude::GetLinksInput>) -> Vec<Vec<zt::prelude::Link>>;
fn get_links_details (Vec<zt::prelude::GetLinksInput>) -> Vec<zt::prelude::LinkDetails>;
fn count_links(zt::prelude::LinkQuery) -> usize;
fn must_get_valid_record (zt::prelude::MustGetValidRecordInput) -> zt::prelude::Record;
fn must_get_entry (zt::prelude::MustGetEntryInput) -> zt::prelude::EntryHashed;
fn must_get_action (zt::prelude::MustGetActionInput) -> zt::prelude::SignedActionHashed;
fn must_get_agent_activity (zt::prelude::MustGetAgentActivityInput) -> Vec<zt::prelude::AgentActivity>;
fn query (zt::prelude::ChainQueryFilter) -> Vec<zt::prelude::Record>;
fn random_bytes (u32) -> zt::prelude::Bytes;
fn send_remote_signal (zt::prelude::RemoteSignal) -> ();
fn schedule (String) -> ();
#[cfg(feature = "unstable-functions")]
fn sleep (core::time::Duration) -> ();
fn sign (zt::prelude::Sign) -> zt::prelude::Signature;
fn sign_ephemeral (zt::prelude::SignEphemeral) -> zt::prelude::EphemeralSignatures;
fn sys_time (()) -> zt::prelude::Timestamp;
fn update (zt::prelude::UpdateInput) -> holo_hash::ActionHash;
fn verify_signature (zt::prelude::VerifySignature) -> bool;
fn zome_info (()) -> zt::prelude::ZomeInfo;
fn create_clone_cell(zt::prelude::CreateCloneCellInput) -> zt::prelude::ClonedCell;
fn disable_clone_cell(zt::prelude::DisableCloneCellInput) -> ();
fn enable_clone_cell(zt::prelude::EnableCloneCellInput) -> zt::prelude::ClonedCell;
fn delete_clone_cell(zt::clone::DeleteCloneCellInput) -> ();
fn close_chain(zt::prelude::CloseChainInput) -> holo_hash::ActionHash;
fn open_chain(zt::prelude::OpenChainInput) -> holo_hash::ActionHash;
fn get_init_properties(()) -> Option<zt::prelude::InitProperties>;
fn get_validation_receipts(zt::prelude::GetValidationReceiptsInput) -> Vec<zt::prelude::ValidationReceiptSet>;
}