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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use crate::utils;
use deepkey::*;
use serde_bytes::ByteArray;

use hdk::prelude::*;
use hdk_extensions::{
    hdi_extensions::{
        guest_error,
    },
};


#[hdk_extern]
pub fn query_key_metas_for_app_binding(addr: ActionHash) -> ExternResult<Vec<KeyMeta>> {
    Ok(
        utils::query_entry_type( EntryTypesUnit::KeyMeta )?
            .into_iter()
            .filter_map( |record| KeyMeta::try_from( record ).ok() )
            .filter( |key_meta| key_meta.app_binding_addr == addr )
            .collect()
    )
}


#[hdk_extern]
pub fn query_key_metas_for_app_index(app_index: u32) -> ExternResult<Vec<KeyMeta>> {
    query_key_metas_for_app_binding(
        crate::app_binding::query_app_binding_by_index( app_index )?.0
    )
}


#[hdk_extern]
pub fn query_next_key_index_for_app_index(app_index: u32) -> ExternResult<u32> {
    Ok( query_key_metas_for_app_index( app_index )?.len() as u32 )
}


#[hdk_extern]
pub fn query_key_meta_records(_: ()) -> ExternResult<Vec<Record>> {
    utils::query_entry_type( EntryTypesUnit::KeyMeta )
}


#[hdk_extern]
pub fn query_key_metas(_: ()) -> ExternResult<Vec<KeyMeta>> {
    Ok(
        utils::query_entry_type( EntryTypesUnit::KeyMeta )?
            .into_iter()
            .filter_map( |record| KeyMeta::try_from( record ).ok() )
            .collect()
    )
}


#[hdk_extern]
pub fn query_key_meta_for_key_addr(anchor_addr: ActionHash) -> ExternResult<KeyMeta> {
    query_key_metas(())?
        .into_iter()
        .find( |key_meta| key_meta.key_anchor_addr == anchor_addr  )
        .ok_or(guest_error!(format!("No KeyMeta for anchor addr: {}", anchor_addr )))
}


#[hdk_extern]
pub fn query_key_meta_for_key(
    key_bytes: ByteArray<32>
) -> ExternResult<KeyMeta> {
    let key_anchor_addr = crate::key_anchor::query_action_addr_for_key_anchor( key_bytes )?;

    Ok( query_key_meta_for_key_addr( key_anchor_addr )? )
}


#[hdk_extern]
pub fn query_key_meta_for_registration(key_reg_addr: ActionHash) -> ExternResult<KeyMeta> {
    query_key_metas(())?
        .into_iter()
        .find( |key_meta| key_meta.key_registration_addr == key_reg_addr  )
        .ok_or(guest_error!(format!("No KeyMeta for registration addr: {}", key_reg_addr )))
}