use crate::generated::models::{
BackupKeyResult, CreateKeyParameters, DeletedKey, GetRandomBytesParameters,
ImportKeyParameters, Key, KeyClientBackupKeyOptions, KeyClientCreateKeyOptions,
KeyClientDecryptOptions, KeyClientDeleteKeyOptions, KeyClientEncryptOptions,
KeyClientGetDeletedKeyOptions, KeyClientGetKeyAttestationOptions, KeyClientGetKeyOptions,
KeyClientGetKeyRotationPolicyOptions, KeyClientGetRandomBytesOptions,
KeyClientImportKeyOptions, KeyClientListDeletedKeyPropertiesOptions,
KeyClientListKeyPropertiesOptions, KeyClientListKeyPropertiesVersionsOptions,
KeyClientPurgeDeletedKeyOptions, KeyClientRecoverDeletedKeyOptions, KeyClientReleaseOptions,
KeyClientRestoreKeyOptions, KeyClientRotateKeyOptions, KeyClientSignOptions,
KeyClientUnwrapKeyOptions, KeyClientUpdateKeyPropertiesOptions,
KeyClientUpdateKeyRotationPolicyOptions, KeyClientVerifyOptions, KeyClientWrapKeyOptions,
KeyOperationParameters, KeyOperationResult, KeyReleaseResult, KeyRotationPolicy,
KeyVerifyResult, ListDeletedKeyPropertiesResult, ListKeyPropertiesResult, RandomBytes,
ReleaseParameters, RestoreKeyParameters, SignParameters, UpdateKeyPropertiesParameters,
VerifyParameters,
};
use azure_core::{
credentials::TokenCredential,
error::{ErrorKind, HttpError},
fmt::SafeDebug,
http::{
policies::{BearerTokenCredentialPolicy, Policy},
ClientOptions, Context, Method, NoFormat, Pager, PagerResult, PagerState, Pipeline,
RawResponse, Request, RequestContent, Response, Url,
},
json, tracing, Error, Result,
};
use std::sync::Arc;
#[tracing::client]
pub struct KeyClient {
pub(crate) api_version: String,
pub(crate) endpoint: Url,
pub(crate) pipeline: Pipeline,
}
#[derive(Clone, SafeDebug)]
pub struct KeyClientOptions {
pub api_version: String,
pub client_options: ClientOptions,
}
impl KeyClient {
#[tracing::new("azure_security_keyvault_keys")]
pub fn new(
endpoint: &str,
credential: Arc<dyn TokenCredential>,
options: Option<KeyClientOptions>,
) -> Result<Self> {
let options = options.unwrap_or_default();
let mut endpoint = Url::parse(endpoint)?;
if !endpoint.scheme().starts_with("http") {
return Err(azure_core::Error::message(
azure_core::error::ErrorKind::Other,
format!("{endpoint} must use http(s)"),
));
}
endpoint.set_query(None);
let auth_policy: Arc<dyn Policy> = Arc::new(BearerTokenCredentialPolicy::new(
credential,
vec!["https://vault.azure.net/.default"],
));
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::default(),
vec![auth_policy],
),
})
}
pub fn endpoint(&self) -> &Url {
&self.endpoint
}
#[tracing::function("KeyVault.backupKey")]
pub async fn backup_key(
&self,
key_name: &str,
options: Option<KeyClientBackupKeyOptions<'_>>,
) -> Result<Response<BackupKeyResult>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/backup");
path = path.replace("{key-name}", key_name);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Post);
request.insert_header("accept", "application/json");
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.createKey")]
pub async fn create_key(
&self,
key_name: &str,
parameters: RequestContent<CreateKeyParameters>,
options: Option<KeyClientCreateKeyOptions<'_>>,
) -> Result<Response<Key>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/create");
path = path.replace("{key-name}", key_name);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Post);
request.insert_header("accept", "application/json");
request.insert_header("content-type", "application/json");
request.set_body(parameters);
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.decrypt")]
pub async fn decrypt(
&self,
key_name: &str,
key_version: &str,
parameters: RequestContent<KeyOperationParameters>,
options: Option<KeyClientDecryptOptions<'_>>,
) -> Result<Response<KeyOperationResult>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/{key-version}/decrypt");
path = path.replace("{key-name}", key_name);
path = path.replace("{key-version}", key_version);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Post);
request.insert_header("accept", "application/json");
request.insert_header("content-type", "application/json");
request.set_body(parameters);
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.deleteKey")]
pub async fn delete_key(
&self,
key_name: &str,
options: Option<KeyClientDeleteKeyOptions<'_>>,
) -> Result<Response<DeletedKey>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}");
path = path.replace("{key-name}", key_name);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Delete);
request.insert_header("accept", "application/json");
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.encrypt")]
pub async fn encrypt(
&self,
key_name: &str,
key_version: &str,
parameters: RequestContent<KeyOperationParameters>,
options: Option<KeyClientEncryptOptions<'_>>,
) -> Result<Response<KeyOperationResult>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/{key-version}/encrypt");
path = path.replace("{key-name}", key_name);
path = path.replace("{key-version}", key_version);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Post);
request.insert_header("accept", "application/json");
request.insert_header("content-type", "application/json");
request.set_body(parameters);
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.getDeletedKey")]
pub async fn get_deleted_key(
&self,
key_name: &str,
options: Option<KeyClientGetDeletedKeyOptions<'_>>,
) -> Result<Response<DeletedKey>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("deletedkeys/{key-name}");
path = path.replace("{key-name}", key_name);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Get);
request.insert_header("accept", "application/json");
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.getKey")]
pub async fn get_key(
&self,
key_name: &str,
key_version: &str,
options: Option<KeyClientGetKeyOptions<'_>>,
) -> Result<Response<Key>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/{key-version}");
path = path.replace("{key-name}", key_name);
path = path.replace("{key-version}", key_version);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Get);
request.insert_header("accept", "application/json");
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.getKeyAttestation")]
pub async fn get_key_attestation(
&self,
key_name: &str,
key_version: &str,
options: Option<KeyClientGetKeyAttestationOptions<'_>>,
) -> Result<Response<Key>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/{key-version}/attestation");
path = path.replace("{key-name}", key_name);
path = path.replace("{key-version}", key_version);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Get);
request.insert_header("accept", "application/json");
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.getKeyRotationPolicy")]
pub async fn get_key_rotation_policy(
&self,
key_name: &str,
options: Option<KeyClientGetKeyRotationPolicyOptions<'_>>,
) -> Result<Response<KeyRotationPolicy>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/rotationpolicy");
path = path.replace("{key-name}", key_name);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Get);
request.insert_header("accept", "application/json");
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.getRandomBytes")]
pub async fn get_random_bytes(
&self,
parameters: RequestContent<GetRandomBytesParameters>,
options: Option<KeyClientGetRandomBytesOptions<'_>>,
) -> Result<Response<RandomBytes>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
url = url.join("rng")?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Post);
request.insert_header("accept", "application/json");
request.insert_header("content-type", "application/json");
request.set_body(parameters);
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.importKey")]
pub async fn import_key(
&self,
key_name: &str,
parameters: RequestContent<ImportKeyParameters>,
options: Option<KeyClientImportKeyOptions<'_>>,
) -> Result<Response<Key>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}");
path = path.replace("{key-name}", key_name);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Put);
request.insert_header("accept", "application/json");
request.insert_header("content-type", "application/json");
request.set_body(parameters);
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.getDeletedKeys")]
pub fn list_deleted_key_properties(
&self,
options: Option<KeyClientListDeletedKeyPropertiesOptions<'_>>,
) -> Result<Pager<ListDeletedKeyPropertiesResult>> {
let options = options.unwrap_or_default().into_owned();
let pipeline = self.pipeline.clone();
let mut first_url = self.endpoint.clone();
first_url = first_url.join("deletedkeys")?;
first_url
.query_pairs_mut()
.append_pair("api-version", &self.api_version);
if let Some(maxresults) = options.maxresults {
first_url
.query_pairs_mut()
.append_pair("maxresults", &maxresults.to_string());
}
let api_version = self.api_version.clone();
Ok(Pager::from_callback(move |next_link: PagerState<Url>| {
let url = match next_link {
PagerState::More(next_link) => {
let qp = next_link
.query_pairs()
.filter(|(name, _)| name.ne("api-version"));
let mut next_link = next_link.clone();
next_link
.query_pairs_mut()
.clear()
.extend_pairs(qp)
.append_pair("api-version", &api_version);
next_link
}
PagerState::Initial => first_url.clone(),
};
let mut request = Request::new(url, Method::Get);
request.insert_header("accept", "application/json");
let ctx = options.method_options.context.clone();
let pipeline = pipeline.clone();
async move {
let rsp: RawResponse = pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
let (status, headers, body) = rsp.deconstruct();
let bytes = body.collect().await?;
let res: ListDeletedKeyPropertiesResult = json::from_json(&bytes)?;
let rsp = RawResponse::from_bytes(status, headers, bytes).into();
Ok(match res.next_link {
Some(next_link) if !next_link.is_empty() => PagerResult::More {
response: rsp,
continuation: next_link.parse()?,
},
_ => PagerResult::Done { response: rsp },
})
}
}))
}
#[tracing::function("KeyVault.getKeys")]
pub fn list_key_properties(
&self,
options: Option<KeyClientListKeyPropertiesOptions<'_>>,
) -> Result<Pager<ListKeyPropertiesResult>> {
let options = options.unwrap_or_default().into_owned();
let pipeline = self.pipeline.clone();
let mut first_url = self.endpoint.clone();
first_url = first_url.join("keys")?;
first_url
.query_pairs_mut()
.append_pair("api-version", &self.api_version);
if let Some(maxresults) = options.maxresults {
first_url
.query_pairs_mut()
.append_pair("maxresults", &maxresults.to_string());
}
let api_version = self.api_version.clone();
Ok(Pager::from_callback(move |next_link: PagerState<Url>| {
let url = match next_link {
PagerState::More(next_link) => {
let qp = next_link
.query_pairs()
.filter(|(name, _)| name.ne("api-version"));
let mut next_link = next_link.clone();
next_link
.query_pairs_mut()
.clear()
.extend_pairs(qp)
.append_pair("api-version", &api_version);
next_link
}
PagerState::Initial => first_url.clone(),
};
let mut request = Request::new(url, Method::Get);
request.insert_header("accept", "application/json");
let ctx = options.method_options.context.clone();
let pipeline = pipeline.clone();
async move {
let rsp: RawResponse = pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
let (status, headers, body) = rsp.deconstruct();
let bytes = body.collect().await?;
let res: ListKeyPropertiesResult = json::from_json(&bytes)?;
let rsp = RawResponse::from_bytes(status, headers, bytes).into();
Ok(match res.next_link {
Some(next_link) if !next_link.is_empty() => PagerResult::More {
response: rsp,
continuation: next_link.parse()?,
},
_ => PagerResult::Done { response: rsp },
})
}
}))
}
#[tracing::function("KeyVault.getKeyVersions")]
pub fn list_key_properties_versions(
&self,
key_name: &str,
options: Option<KeyClientListKeyPropertiesVersionsOptions<'_>>,
) -> Result<Pager<ListKeyPropertiesResult>> {
let options = options.unwrap_or_default().into_owned();
let pipeline = self.pipeline.clone();
let mut first_url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/versions");
path = path.replace("{key-name}", key_name);
first_url = first_url.join(&path)?;
first_url
.query_pairs_mut()
.append_pair("api-version", &self.api_version);
if let Some(maxresults) = options.maxresults {
first_url
.query_pairs_mut()
.append_pair("maxresults", &maxresults.to_string());
}
let api_version = self.api_version.clone();
Ok(Pager::from_callback(move |next_link: PagerState<Url>| {
let url = match next_link {
PagerState::More(next_link) => {
let qp = next_link
.query_pairs()
.filter(|(name, _)| name.ne("api-version"));
let mut next_link = next_link.clone();
next_link
.query_pairs_mut()
.clear()
.extend_pairs(qp)
.append_pair("api-version", &api_version);
next_link
}
PagerState::Initial => first_url.clone(),
};
let mut request = Request::new(url, Method::Get);
request.insert_header("accept", "application/json");
let ctx = options.method_options.context.clone();
let pipeline = pipeline.clone();
async move {
let rsp: RawResponse = pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
let (status, headers, body) = rsp.deconstruct();
let bytes = body.collect().await?;
let res: ListKeyPropertiesResult = json::from_json(&bytes)?;
let rsp = RawResponse::from_bytes(status, headers, bytes).into();
Ok(match res.next_link {
Some(next_link) if !next_link.is_empty() => PagerResult::More {
response: rsp,
continuation: next_link.parse()?,
},
_ => PagerResult::Done { response: rsp },
})
}
}))
}
#[tracing::function("KeyVault.purgeDeletedKey")]
pub async fn purge_deleted_key(
&self,
key_name: &str,
options: Option<KeyClientPurgeDeletedKeyOptions<'_>>,
) -> Result<Response<(), NoFormat>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("deletedkeys/{key-name}");
path = path.replace("{key-name}", key_name);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Delete);
request.insert_header("accept", "application/json");
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.recoverDeletedKey")]
pub async fn recover_deleted_key(
&self,
key_name: &str,
options: Option<KeyClientRecoverDeletedKeyOptions<'_>>,
) -> Result<Response<Key>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("deletedkeys/{key-name}/recover");
path = path.replace("{key-name}", key_name);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Post);
request.insert_header("accept", "application/json");
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.release")]
pub async fn release(
&self,
key_name: &str,
key_version: &str,
parameters: RequestContent<ReleaseParameters>,
options: Option<KeyClientReleaseOptions<'_>>,
) -> Result<Response<KeyReleaseResult>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/{key-version}/release");
path = path.replace("{key-name}", key_name);
path = path.replace("{key-version}", key_version);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Post);
request.insert_header("accept", "application/json");
request.insert_header("content-type", "application/json");
request.set_body(parameters);
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.restoreKey")]
pub async fn restore_key(
&self,
parameters: RequestContent<RestoreKeyParameters>,
options: Option<KeyClientRestoreKeyOptions<'_>>,
) -> Result<Response<Key>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
url = url.join("keys/restore")?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Post);
request.insert_header("accept", "application/json");
request.insert_header("content-type", "application/json");
request.set_body(parameters);
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.rotateKey")]
pub async fn rotate_key(
&self,
key_name: &str,
options: Option<KeyClientRotateKeyOptions<'_>>,
) -> Result<Response<Key>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/rotate");
path = path.replace("{key-name}", key_name);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Post);
request.insert_header("accept", "application/json");
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.sign")]
pub async fn sign(
&self,
key_name: &str,
key_version: &str,
parameters: RequestContent<SignParameters>,
options: Option<KeyClientSignOptions<'_>>,
) -> Result<Response<KeyOperationResult>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/{key-version}/sign");
path = path.replace("{key-name}", key_name);
path = path.replace("{key-version}", key_version);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Post);
request.insert_header("accept", "application/json");
request.insert_header("content-type", "application/json");
request.set_body(parameters);
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.unwrapKey")]
pub async fn unwrap_key(
&self,
key_name: &str,
key_version: &str,
parameters: RequestContent<KeyOperationParameters>,
options: Option<KeyClientUnwrapKeyOptions<'_>>,
) -> Result<Response<KeyOperationResult>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/{key-version}/unwrapkey");
path = path.replace("{key-name}", key_name);
path = path.replace("{key-version}", key_version);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Post);
request.insert_header("accept", "application/json");
request.insert_header("content-type", "application/json");
request.set_body(parameters);
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.updateKey")]
pub async fn update_key_properties(
&self,
key_name: &str,
key_version: &str,
parameters: RequestContent<UpdateKeyPropertiesParameters>,
options: Option<KeyClientUpdateKeyPropertiesOptions<'_>>,
) -> Result<Response<Key>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/{key-version}");
path = path.replace("{key-name}", key_name);
path = path.replace("{key-version}", key_version);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Patch);
request.insert_header("accept", "application/json");
request.insert_header("content-type", "application/json");
request.set_body(parameters);
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.updateKeyRotationPolicy")]
pub async fn update_key_rotation_policy(
&self,
key_name: &str,
key_rotation_policy: RequestContent<KeyRotationPolicy>,
options: Option<KeyClientUpdateKeyRotationPolicyOptions<'_>>,
) -> Result<Response<KeyRotationPolicy>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/rotationpolicy");
path = path.replace("{key-name}", key_name);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Put);
request.insert_header("accept", "application/json");
request.insert_header("content-type", "application/json");
request.set_body(key_rotation_policy);
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.verify")]
pub async fn verify(
&self,
key_name: &str,
key_version: &str,
parameters: RequestContent<VerifyParameters>,
options: Option<KeyClientVerifyOptions<'_>>,
) -> Result<Response<KeyVerifyResult>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/{key-version}/verify");
path = path.replace("{key-name}", key_name);
path = path.replace("{key-version}", key_version);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Post);
request.insert_header("accept", "application/json");
request.insert_header("content-type", "application/json");
request.set_body(parameters);
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
#[tracing::function("KeyVault.wrapKey")]
pub async fn wrap_key(
&self,
key_name: &str,
key_version: &str,
parameters: RequestContent<KeyOperationParameters>,
options: Option<KeyClientWrapKeyOptions<'_>>,
) -> Result<Response<KeyOperationResult>> {
let options = options.unwrap_or_default();
let ctx = Context::with_context(&options.method_options.context);
let mut url = self.endpoint.clone();
let mut path = String::from("keys/{key-name}/{key-version}/wrapkey");
path = path.replace("{key-name}", key_name);
path = path.replace("{key-version}", key_version);
url = url.join(&path)?;
url.query_pairs_mut()
.append_pair("api-version", &self.api_version);
let mut request = Request::new(url, Method::Post);
request.insert_header("accept", "application/json");
request.insert_header("content-type", "application/json");
request.set_body(parameters);
let rsp = self.pipeline.send(&ctx, &mut request).await?;
if !rsp.status().is_success() {
let status = rsp.status();
let http_error = HttpError::new(rsp).await;
let error_kind = ErrorKind::http_response(
status,
http_error.error_code().map(std::borrow::ToOwned::to_owned),
);
return Err(Error::new(error_kind, http_error));
}
Ok(rsp.into())
}
}
impl Default for KeyClientOptions {
fn default() -> Self {
Self {
api_version: String::from("7.6"),
client_options: ClientOptions::default(),
}
}
}