atproto_identity/
plc.rs

1//! PLC directory client for did:plc resolution.
2//!
3//! Fetches DID documents from PLC directory servers using HTTPS requests
4//! to resolve did:plc identifiers in the AT Protocol ecosystem.
5
6use tracing::{Instrument, instrument};
7
8use super::errors::PLCDIDError;
9use super::model::Document;
10
11/// Queries a PLC directory for a DID document.
12/// Fetches the complete DID document from the specified PLC hostname.
13#[instrument(skip(http_client), err)]
14pub async fn query(
15    http_client: &reqwest::Client,
16    plc_hostname: &str,
17    did: &str,
18) -> Result<Document, PLCDIDError> {
19    let url = format!("https://{}/{}", plc_hostname, did);
20
21    http_client
22        .get(&url)
23        .send()
24        .instrument(tracing::info_span!("http_client_get"))
25        .await
26        .map_err(|error| PLCDIDError::HttpRequestFailed {
27            url: url.clone(),
28            error,
29        })?
30        .json::<Document>()
31        .await
32        .map_err(|error| PLCDIDError::DocumentParseFailed { url, error })
33}