use std::collections::HashMap;
pub use error::*;
use holochain_zome_types::EntryDefIndex;
use holochain_zome_types::LinkType;
use holochain_zome_types::ScopedZomeTypes;
use holochain_zome_types::ScopedZomeTypesSet;
use holochain_zome_types::ZomeIndex;
#[allow(missing_docs)]
mod error;
#[cfg(test)]
mod test;
pub type NumZomeTypes = u8;
#[derive(Clone, Debug, PartialEq, Default)]
pub struct GlobalZomeTypes {
entries: HashMap<ZomeIndex, NumZomeTypes>,
links: HashMap<ZomeIndex, NumZomeTypes>,
}
impl GlobalZomeTypes {
pub fn from_ordered_iterator<I>(ordered_iterator: I) -> ZomeTypesResult<GlobalZomeTypes>
where
I: IntoIterator<Item = (EntryDefIndex, LinkType)>,
{
let r = ordered_iterator.into_iter().enumerate().try_fold(
Self::default(),
|mut zome_types, (zome_index, (num_entry_types, num_link_types))| {
let zome_index: ZomeIndex = u8::try_from(zome_index)
.map_err(|_| ZomeTypesError::ZomeIndexOverflow)?
.into();
zome_types.entries.insert(zome_index, num_entry_types.0);
zome_types.links.insert(zome_index, num_link_types.0);
Ok(zome_types)
},
)?;
Ok(r)
}
pub fn in_scope_subset(&self, zomes: &[ZomeIndex]) -> ScopedZomeTypesSet {
let entries = zomes.iter().filter_map(|zome_index| {
self.entries
.get_key_value(zome_index)
.map(|(z, l)| (*z, *l))
});
let entries = new_scope(entries);
let links = zomes
.iter()
.filter_map(|zome_index| self.links.get_key_value(zome_index).map(|(z, l)| (*z, *l)));
let links = new_scope(links);
ScopedZomeTypesSet { entries, links }
}
}
fn new_scope<T>(iter: impl Iterator<Item = (ZomeIndex, NumZomeTypes)>) -> ScopedZomeTypes<T>
where
T: From<u8>,
{
let iter = iter
.map(|(zome_index, len)| (zome_index, (0..len).map(Into::into).collect()))
.collect();
ScopedZomeTypes(iter)
}