This repository has no description
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}