Skip to main content

atrium_identity/did/
common_resolver.rs

1use 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 {}