This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

core / knot2 / crates / knot-cobs / src / import.rs
1.9 kB 55 lines
1use knot_cob::{ 2 ActorId, ChangePayload, CobError, CobHome, CobId, CobStore, TypeName, parse_cob_ref, 3}; 4use knot_types::RefName; 5 6use crate::collaborators::{CollaboratorsChange, CollaboratorsCob}; 7use crate::members::{MembersChange, MembersCob}; 8use crate::registry::{RegistryChange, RepoRegistryCob}; 9 10#[derive(Debug, thiserror::Error)] 11pub enum ImportError { 12 #[error("'{0}' isn't refs/cobs/<nsid>/<oid> ref")] 13 NotCobRef(String), 14 #[error("no collaborative object type is registered for namespace '{0}'")] 15 UnknownType(TypeName), 16 #[error(transparent)] 17 Cob(#[from] CobError), 18} 19 20type Verifier = fn(&CobStore<'_>, &CobHome, CobId, &ActorId) -> Result<(), CobError>; 21 22fn verifier_for(type_name: &TypeName) -> Option<Verifier> { 23 [ 24 (MembersChange::type_name(), { 25 |store: &CobStore<'_>, home, object, owner| { 26 store.verify::<MembersCob>(home, object, owner) 27 } 28 } as Verifier), 29 (CollaboratorsChange::type_name(), { 30 |store: &CobStore<'_>, home, object, owner| { 31 store.verify::<CollaboratorsCob>(home, object, owner) 32 } 33 } as Verifier), 34 (RegistryChange::type_name(), { 35 |store: &CobStore<'_>, home, object, owner| { 36 store.verify::<RepoRegistryCob>(home, object, owner) 37 } 38 } as Verifier), 39 ] 40 .into_iter() 41 .find_map(|(name, verifier)| (name == *type_name).then_some(verifier)) 42} 43 44pub fn verify_cob_ref( 45 store: &CobStore, 46 home: &CobHome, 47 refname: &RefName, 48 owner: &ActorId, 49) -> Result<CobId, ImportError> { 50 let (type_name, object) = parse_cob_ref(refname.as_str()) 51 .ok_or_else(|| ImportError::NotCobRef(refname.as_str().to_string()))?; 52 let verifier = verifier_for(&type_name).ok_or(ImportError::UnknownType(type_name))?; 53 verifier(store, home, object, owner)?; 54 Ok(object) 55}