ssi_data_integrity/any/
resolution.rs

1use std::{borrow::Cow, marker::PhantomData};
2
3use ssi_verification_methods::{InvalidVerificationMethod, VerificationMethod};
4
5pub struct AnyResolver<R, M>(R, PhantomData<M>);
6
7impl<R, M> AnyResolver<R, M> {
8    pub fn new(resolver: R) -> Self {
9        Self(resolver, PhantomData)
10    }
11}
12
13impl<R, M> ssi_verification_methods::VerificationMethodResolver for AnyResolver<R, M>
14where
15    R: ssi_verification_methods::VerificationMethodResolver<
16        Method = ssi_verification_methods::AnyMethod,
17    >,
18    M: VerificationMethod
19        + TryFrom<ssi_verification_methods::AnyMethod, Error = InvalidVerificationMethod>
20        + Into<ssi_verification_methods::AnyMethod>,
21{
22    type Method = M;
23
24    async fn resolve_verification_method_with(
25        &self,
26        issuer: Option<&iref::Iri>,
27        method: Option<ssi_verification_methods::ReferenceOrOwnedRef<'_, Self::Method>>,
28        options: ssi_verification_methods::ResolutionOptions,
29    ) -> Result<Cow<Self::Method>, ssi_verification_methods::VerificationMethodResolutionError>
30    {
31        let method = method.map(|m| match m {
32            ssi_verification_methods::ReferenceOrOwnedRef::Reference(uri) => {
33                ssi_verification_methods::ReferenceOrOwned::Reference(uri.to_owned())
34            }
35            ssi_verification_methods::ReferenceOrOwnedRef::Owned(m) => {
36                ssi_verification_methods::ReferenceOrOwned::Owned(m.clone().into())
37            }
38        });
39
40        let any_method = self
41            .0
42            .resolve_verification_method_with(
43                issuer,
44                method.as_ref().map(|m| m.borrowed()),
45                options,
46            )
47            .await?
48            .into_owned();
49        any_method.try_into().map(Cow::Owned).map_err(
50            ssi_verification_methods::VerificationMethodResolutionError::InvalidVerificationMethod,
51        )
52    }
53}