Function holochain::core::workflow::sys_validation_workflow::sys_validate_record
source · pub async fn sys_validate_record(
record: &Record,
call_zome_workspace: &HostFnWorkspace,
network: HolochainP2pDna,
conductor_handle: &Conductor
) -> SysValidationOutcome<()>
Expand description
Direct system validation call that takes a Record instead of an op. Does not require holding dependencies. Will not await dependencies and instead returns that outcome immediately.
Examples found in repository?
src/core/workflow/call_zome_workflow.rs (line 242)
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
pub async fn inline_validation<Ribosome>(
workspace: SourceChainWorkspace,
network: HolochainP2pDna,
conductor_handle: ConductorHandle,
ribosome: Ribosome,
) -> WorkflowResult<()>
where
Ribosome: RibosomeT + 'static,
{
let to_app_validate = {
// collect all the records we need to validate in wasm
let scratch_records = workspace.source_chain().scratch_records()?;
let mut to_app_validate: Vec<Record> = Vec::with_capacity(scratch_records.len());
// Loop forwards through all the new records
for record in scratch_records {
sys_validate_record(&record, &workspace, network.clone(), &(*conductor_handle))
.await
// If the was en error exit
// If the validation failed, exit with an InvalidCommit
// If it was ok continue
.or_else(|outcome_or_err| outcome_or_err.invalid_call_zome_commit())?;
to_app_validate.push(record);
}
to_app_validate
};
let mut cascade =
holochain_cascade::Cascade::from_workspace_and_network(&workspace, network.clone());
for mut chain_record in to_app_validate {
for op_type in action_to_op_types(chain_record.action()) {
let op =
app_validation_workflow::record_to_op(chain_record, op_type, &mut cascade).await;
let (op, activity_entry) = match op {
Ok(op) => op,
Err(outcome_or_err) => return map_outcome(Outcome::try_from(outcome_or_err)),
};
let outcome = app_validation_workflow::validate_op(
&op,
workspace.clone().into(),
&network,
&ribosome,
)
.await;
let outcome = outcome.or_else(Outcome::try_from);
map_outcome(outcome)?;
chain_record = app_validation_workflow::op_to_record(op, activity_entry);
}
}
Ok(())
}