ssi_data_integrity/any/
resolution.rs1use 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}