hc_utils 0.5.3

Helper functions for holochain hdk development
Documentation
use hdk::prelude::*;

pub fn get_latest_linked_action(input: GetLinksInput) -> ExternResult<Vec<Record>> {
    let links = get_links(input)?;

    let records: Vec<Record> = links
        .into_iter()
        .filter_map(
            |link| match helper_get_latest_action(link.target.into_any_dht_hash()) {
                Ok(a) => a,
                _ => None,
            },
        )
        .collect();

    Ok(records)
}

fn helper_get_latest_action<H: Into<AnyDhtHash>>(
    action_hash: Option<H>,
) -> ExternResult<Option<Record>> {
    match action_hash {
        Some(hash) => {
            let details = get_details(hash, GetOptions::default())?.ok_or(wasm_error!(
                WasmErrorInner::Guest("Action not found".into())
            ))?;
            let record_details = match details {
                Details::Entry(_) => Err(wasm_error!(WasmErrorInner::Guest(
                    "Malformed details".into()
                ))),
                Details::Record(record_details) => Ok(record_details),
            }?;
            if record_details.deletes.len() > 0 {
                return Ok(None);
            }
            match record_details.updates.last() {
                Some(update) => helper_get_latest_action(Some(update.action_address().clone())),
                None => Ok(Some(record_details.record)),
            }
        }
        None => Ok(None),
    }
}