use azure_core::time::OffsetDateTime;
use azure_identity::DeveloperToolsCredential;
use azure_storage_queue::{
models::{AccessPolicy, SignedIdentifier, SignedIdentifiers},
QueueClient,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let account = std::env::var("AZURE_QUEUE_STORAGE_ACCOUNT_NAME")
.expect("Set AZURE_QUEUE_STORAGE_ACCOUNT_NAME environment variable");
let endpoint = format!("https://{}.queue.core.windows.net/", account);
let queue_name = "access-policy-sample-queue";
let credential = DeveloperToolsCredential::new(None)?;
let queue_client = QueueClient::new(&endpoint, queue_name, Some(credential), None)?;
queue_client.create(None).await?;
println!("Created queue '{queue_name}'");
let expiry =
OffsetDateTime::from_unix_timestamp(1_798_761_600).expect("hardcoded timestamp is valid");
let policy = AccessPolicy {
start: None,
expiry: Some(expiry),
permission: Some("rp".to_string()),
};
let identifiers = SignedIdentifiers {
items: Some(vec![SignedIdentifier {
id: Some("read-only".to_string()),
access_policy: Some(policy),
}]),
};
queue_client
.set_access_policy(identifiers.try_into()?, None)
.await?;
println!("Set access policy 'read-only' on queue '{queue_name}'");
let response = queue_client.get_access_policy(None).await?;
let policies = response.into_model()?;
for identifier in policies.items.unwrap_or_default() {
let id = identifier.id.as_deref().unwrap_or("<unnamed>");
if let Some(ap) = &identifier.access_policy {
println!(
"Policy '{}': permissions={}, start={:?}, expiry={:?}",
id,
ap.permission.as_deref().unwrap_or(""),
ap.start,
ap.expiry,
);
}
}
let empty = SignedIdentifiers { items: None };
queue_client
.set_access_policy(empty.try_into()?, None)
.await?;
println!("Cleared all access policies on queue '{queue_name}'");
queue_client.delete(None).await?;
println!("Deleted queue '{queue_name}'");
Ok(())
}