use crate::authorizer::KeyVaultAuthorizer;
pub use crate::generated::clients::*;
use azure_core::{
credentials::TokenCredential,
fmt::SafeDebug,
http::{
policies::{auth::BearerTokenAuthorizationPolicy, Policy},
ClientOptions, Pipeline, Url,
},
tracing, Result,
};
use std::sync::Arc;
#[derive(Clone, SafeDebug)]
pub struct SecretClientOptions {
pub api_version: String,
pub client_options: ClientOptions,
pub verify_challenge_resource: Option<bool>,
}
impl Default for SecretClientOptions {
fn default() -> Self {
Self {
api_version: String::from(DEFAULT_API_VERSION),
client_options: ClientOptions::default(),
verify_challenge_resource: Some(true),
}
}
}
impl SecretClient {
#[tracing::new("KeyVault")]
pub fn new(
endpoint: &str,
credential: Arc<dyn TokenCredential>,
options: Option<SecretClientOptions>,
) -> Result<Self> {
let options = options.unwrap_or_default();
let endpoint = Url::parse(endpoint)?;
if !endpoint.scheme().starts_with("http") {
return Err(azure_core::Error::with_message(
azure_core::error::ErrorKind::Other,
format!("{endpoint} must use http(s)"),
));
}
let authorizer = KeyVaultAuthorizer::new(options.verify_challenge_resource.unwrap_or(true));
let auth_policy: Arc<dyn Policy> = Arc::new(
BearerTokenAuthorizationPolicy::new(credential, Vec::<String>::new())
.with_on_request(authorizer.clone())
.with_on_challenge(authorizer),
);
Ok(Self {
endpoint,
api_version: options.api_version,
pipeline: Pipeline::new(
option_env!("CARGO_PKG_NAME"),
option_env!("CARGO_PKG_VERSION"),
options.client_options,
Vec::new(),
vec![auth_policy],
None,
),
})
}
}