use crate::client::VtaClient;
use crate::error::VtaError;
use crate::session::TokenResult;
#[derive(Debug, Clone)]
pub struct AutoConnect<'a> {
pub vta_url: &'a str,
pub vta_did: &'a str,
pub credential_did: &'a str,
pub private_key_multibase: &'a str,
pub mediator_did: Option<&'a str>,
}
pub struct ConnectedVta {
pub client: VtaClient,
pub rest_token: Option<TokenResult>,
}
impl VtaClient {
#[cfg(feature = "session")]
pub async fn connect_auto(input: AutoConnect<'_>) -> Result<ConnectedVta, VtaError> {
match input.mediator_did {
Some(mediator) => {
let rest_fallback = (!input.vta_url.is_empty()).then(|| input.vta_url.to_string());
let client = VtaClient::connect_didcomm(
input.credential_did,
input.private_key_multibase,
input.vta_did,
mediator,
rest_fallback,
)
.await?;
Ok(ConnectedVta {
client,
rest_token: None,
})
}
None => {
if input.vta_url.is_empty() {
return Err(VtaError::Validation(
"REST transport requires a non-empty vta_url (no mediator_did was supplied)"
.into(),
));
}
let token = crate::session::challenge_response(
input.vta_url,
input.credential_did,
input.private_key_multibase,
input.vta_did,
)
.await
.map_err(|e| VtaError::Auth(e.to_string()))?;
let client = VtaClient::new(input.vta_url);
client.set_token_async(token.access_token.clone()).await;
Ok(ConnectedVta {
client,
rest_token: Some(token),
})
}
}
}
}