use std::collections::HashMap;
use anyhow::Result;
use atproto_identity::url::build_url;
use serde::{Deserialize, de::DeserializeOwned};
use crate::{
client::{Auth, get_apppassword_json, get_dpop_json, get_json},
errors::SimpleError,
};
#[cfg_attr(any(debug_assertions, test), derive(Debug))]
#[derive(Deserialize, Clone)]
#[serde(untagged)]
pub enum ResolveHandleResponse {
Response {
did: String,
#[serde(flatten)]
extra: HashMap<String, serde_json::Value>,
},
Error(SimpleError),
}
pub async fn resolve_handle<T: DeserializeOwned>(
http_client: &reqwest::Client,
auth: &Auth,
base_url: &str,
handle: String,
) -> Result<ResolveHandleResponse> {
let url = build_url(
base_url,
"/xrpc/com.atproto.identity.resolveHandle",
[("handle", handle.as_str())],
)?
.to_string();
match auth {
Auth::None => get_json(http_client, &url)
.await
.and_then(|value| serde_json::from_value(value).map_err(|err| err.into())),
Auth::DPoP(dpop_auth) => get_dpop_json(http_client, dpop_auth, &url)
.await
.and_then(|value| serde_json::from_value(value).map_err(|err| err.into())),
Auth::AppPassword(app_auth) => get_apppassword_json(http_client, app_auth, &url)
.await
.and_then(|value| serde_json::from_value(value).map_err(|err| err.into())),
}
}