Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Azure Queue Storage library for Rust. Send, receive, and manage queue messages. Triggers: "queue storage rust", "QueueClient rust", "send message rust", "receive messages rust", "QueueServiceClient rust", "queue rust".
.claude/skills/sickn33-azure-storage-queue-rust/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 31% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 34% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 184% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 30% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 33% | 0% |
Use this skill when you need azure Queue Storage library for Rust. Send, receive, and manage queue messages. Triggers: "queue storage rust", "QueueClient rust", "send message rust", "receive messages rust", "QueueServiceClient rust", "queue rust".
Client library for Azure Queue Storage — send, receive, and manage queue messages.
Use this skill when:
> IMPORTANT: Only use the official azure_storage_queue crate published by the azure-sdk crates.io user. Do NOT use unofficial or community crates. Official crates use underscores in names and none have version 0.21.0.
shcargo add azure_storage_queue azure_identity azure_core tokio
> If your code uses azure_core types directly, add azure_core to Cargo.toml. If you only use azure_storage_queue re-exports, direct azure_core dependency is optional.
bashAZURE_STORAGE_QUEUE_ENDPOINT=https://<account>.queue.core.windows.net/ # Required for all operations
rustuse azure_core::http::Url; use azure_identity::DeveloperToolsCredential; use azure_storage_queue::QueueServiceClient; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { // Local dev: DeveloperToolsCredential. Production: use ManagedIdentityCredential. let credential = DeveloperToolsCredential::new(None)?; let service_url = Url::parse("https://<storage_account_name>.queue.core.windows.net/")?; let service_client = QueueServiceClient::new(service_url, Some(credential), None)?; // Derive a queue client by name. let queue_client = service_client.queue_client("<queue_name>")?; Ok(()) }
| Client | Purpose | Access | | -------------------- | ------------------------------------- | ---------------------------------------- | | QueueServiceClient | Account-level operations, list queues | QueueServiceClient::new() | | QueueClient | Queue operations, send/receive/delete | service_client.queue_client("<name>")? |
rustuse azure_core::http::Url; use azure_identity::DeveloperToolsCredential; use azure_storage_queue::{models::QueueMessage, QueueServiceClient}; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let credential = DeveloperToolsCredential::new(None)?; let service_url = Url::parse("https://<storage_account_name>.queue.core.windows.net/")?; let service_client = QueueServiceClient::new(service_url, Some(credential), None)?; let queue_client = service_client.queue_client("<queue_name>")?; let message = QueueMessage { message_text: Some("hello world".to_string()), }; queue_client.send_message(message.try_into()?, None).await?; Ok(()) }
rustuse azure_core::http::Url; use azure_identity::DeveloperToolsCredential; use azure_storage_queue::QueueServiceClient; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let credential = DeveloperToolsCredential::new(None)?; let service_url = Url::parse("https://<storage_account_name>.queue.core.windows.net/")?; let service_client = QueueServiceClient::new(service_url, Some(credential), None)?; let queue_client = service_client.queue_client("<queue_name>")?; let response = queue_client.receive_messages(None).await?; let messages = response.into_model()?; for msg in messages.items.unwrap_or_default() { println!("{}", msg.message_text.as_deref().unwrap_or("<empty>")); } Ok(()) }
After receiving a message, delete it using the message ID and pop receipt:
rustlet response = queue_client.receive_messages(None).await?; let messages = response.into_model()?; for msg in messages.items.unwrap_or_default() { if let (Some(id), Some(pop_receipt)) = (&msg.message_id, &msg.pop_receipt) { queue_client.delete_message(id, pop_receipt, None).await?; } }
Peek at messages without removing them from the queue:
rustlet response = queue_client.peek_messages(None).await?; let messages = response.into_model()?; for msg in messages.items.unwrap_or_default() { println!("Peeked: {}", msg.message_text.as_deref().unwrap_or("<empty>")); }
For Entra ID auth, assign one of these roles to the identity:
| Role | Access | | -------------------------------------- | ---------------------- | | Storage Queue Data Reader | Read and peek messages | | Storage Queue Data Contributor | Read/write messages | | Storage Queue Data Message Sender | Send messages only | | Storage Queue Data Message Processor | Receive and delete |
cargo add to manage dependencies, never edit Cargo.toml directly. Add and remove Rust SDK dependencies with cargo commands instead of manual manifest edits.azure_core only when importing azure_core types directly. If your code imports azure_core::http::Url, azure_core::http::RequestContent, or azure_core::error::ErrorKind, include azure_core; otherwise a direct dependency is optional.DeveloperToolsCredential for local dev, ManagedIdentityCredential for production — Rust does not provide a single DefaultAzureCredential typeQueueServiceClient as the entry point and derive QueueClient from it via queue_client()receive_messages| Resource | Link | | ------------- | ------------------------------------------------------------------------------------- | | API Reference | https://docs.rs/crate/azure_storage_queue/latest | | crates.io | https://crates.io/crates/azure_storage_queue | | Source Code | https://github.com/Azure/azure-sdk-for-rust/tree/main/sdk/storage/azure_storage_queue |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-13 | pass→pass | 7,543 | 1,439 | -81% | 1 | 1 | 0% | 1,404 | 2,006 | +43% | 0 | 0 | — |
case-18 | pass→pass | 8,019 | 8,215 | +2% | 1 | 1 | 0% | 1,365 | 3,416 | +150% | 0 | 0 | — |
case-01 | fail→pass | 10,353 | 5,577 | -46% | 1 | 1 | 0% | 2,373 | 3,111 | +31% | 0 | 0 | — |
case-02 | fail→pass | 12,298 | 6,534 | -47% | 1 | 1 | 0% | 2,591 | 3,482 | +34% | 0 | 0 | — |
case-08 | pass→pass | 11,043 | 3,408 | -69% | 1 | 1 | 0% | 2,044 | 2,402 | +18% | 0 | 0 | — |
case-03 | pass→pass | 9,129 | 6,813 | -25% | 1 | 1 | 0% | 1,871 | 3,236 | +73% | 0 | 0 | — |
case-04 | fail→pass | 4,396 | 3,221 | -27% | 1 | 1 | 0% | 827 | 2,351 | +184% | 0 | 0 | — |
case-05 | fail→pass | 12,619 | 5,856 | -54% | 1 | 1 | 0% | 2,363 | 3,061 | +30% | 0 | 0 | — |
case-06 | fail→pass | 12,907 | 8,020 | -38% | 1 | 1 | 0% | 2,614 | 3,480 | +33% | 0 | 0 | — |
case-07 | pass→pass | 9,801 | 3,776 | -61% | 1 | 1 | 0% | 1,935 | 2,594 | +34% | 0 | 0 | — |
case-09 | pass→pass | 7,048 | 2,887 | -59% | 1 | 1 | 0% | 1,437 | 2,275 | +58% | 0 | 0 | — |
case-10 | pass→pass | 3,435 | 2,205 | -36% | 1 | 1 | 0% | 585 | 2,195 | +275% | 0 | 0 | — |
case-11 | pass→pass | 3,886 | 2,157 | -44% | 1 | 1 | 0% | 663 | 2,132 | +222% | 0 | 0 | — |
case-12 | pass→pass | 3,314 | 1,486 | -55% | 1 | 1 | 0% | 561 | 2,026 | +261% | 0 | 0 | — |
case-14 | pass→pass | 11,136 | 6,034 | -46% | 1 | 1 | 0% | 2,044 | 3,016 | +48% | 0 | 0 | — |
case-15 | pass→pass | 9,128 | 6,108 | -33% | 1 | 1 | 0% | 1,795 | 3,256 | +81% | 0 | 0 | — |
case-16 | pass→pass | 9,790 | 6,712 | -31% | 1 | 1 | 0% | 1,935 | 2,986 | +54% | 0 | 0 | — |
case-17 | pass→pass | 8,916 | 5,821 | -35% | 1 | 1 | 0% | 1,745 | 2,677 | +53% | 0 | 0 | — |
case-19 | pass→pass | 8,637 | 2,699 | -69% | 1 | 1 | 0% | 1,520 | 2,224 | +46% | 0 | 0 | — |
case-20 | fail→pass | 13,843 | 2,399 | -83% | 1 | 1 | 0% | 2,774 | 2,173 | -22% | 0 | 0 | — |
case-21 | pass→pass | 11,559 | 7,617 | -34% | 1 | 1 | 0% | 2,401 | 3,537 | +47% | 0 | 0 | — |
case-22 | pass→pass | 11,047 | 6,648 | -40% | 1 | 1 | 0% | 1,827 | 2,954 | +62% | 0 | 0 | — |
case-23 | pass→pass | 6,505 | 2,391 | -63% | 1 | 1 | 0% | 1,232 | 2,146 | +74% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +26 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.