atrium_identity/did/
common_resolver.rs1use atrium_api::did_doc::DidDocument;
2use atrium_api::types::string::Did;
3use atrium_common::resolver::Resolver;
4use atrium_xrpc::HttpClient;
5
6use super::DidResolver;
7use super::plc_resolver::{PlcDidResolver, PlcDidResolverConfig};
8use super::web_resolver::{WebDidResolver, WebDidResolverConfig};
9use crate::error::{Error, Result};
10use std::sync::Arc;
11
12#[derive(Clone, Debug)]
13pub struct CommonDidResolverConfig<T> {
14 pub plc_directory_url: String,
15 pub http_client: Arc<T>,
16}
17
18pub struct CommonDidResolver<T> {
19 plc_resolver: PlcDidResolver<T>,
20 web_resolver: WebDidResolver<T>,
21}
22
23impl<T> CommonDidResolver<T> {
24 pub fn new(config: CommonDidResolverConfig<T>) -> Self {
25 Self {
26 plc_resolver: PlcDidResolver::new(PlcDidResolverConfig {
27 plc_directory_url: config.plc_directory_url,
28 http_client: config.http_client.clone(),
29 }),
30 web_resolver: WebDidResolver::new(WebDidResolverConfig {
31 http_client: config.http_client,
32 }),
33 }
34 }
35}
36
37impl<T> Resolver for CommonDidResolver<T>
38where
39 PlcDidResolver<T>: DidResolver + Send + Sync + 'static,
40 WebDidResolver<T>: DidResolver + Send + Sync + 'static,
41{
42 type Input = Did;
43 type Output = DidDocument;
44 type Error = Error;
45
46 async fn resolve(&self, did: &Self::Input) -> Result<Self::Output> {
47 match did.strip_prefix("did:").and_then(|s| s.split_once(':').map(|(method, _)| method)) {
48 Some("plc") => self.plc_resolver.resolve(did).await,
49 Some("web") => self.web_resolver.resolve(did).await,
50 _ => Err(Error::UnsupportedDidMethod(did.clone())),
51 }
52 }
53}
54
55impl<T> DidResolver for CommonDidResolver<T> where T: HttpClient + Send + Sync + 'static {}