use crate::{
operations::*, PopReceipt, PopReceiptClient, QueueServiceClient, QueueStoredAccessPolicy,
};
use azure_core::{prelude::*, Context, Request, Response};
use std::fmt::Debug;
#[derive(Debug, Clone)]
pub struct QueueClient {
service_client: QueueServiceClient,
queue_name: String,
}
impl QueueClient {
pub(crate) fn new(service_client: QueueServiceClient, queue_name: String) -> Self {
Self {
service_client,
queue_name,
}
}
pub fn create(&self) -> CreateQueueBuilder {
CreateQueueBuilder::new(self.clone())
}
pub fn delete(&self) -> DeleteQueueBuilder {
DeleteQueueBuilder::new(self.clone())
}
pub fn set_metadata(&self, metadata: Metadata) -> SetQueueMetadataBuilder {
SetQueueMetadataBuilder::new(self.clone(), metadata)
}
pub fn get_metadata(&self) -> GetQueueMetadataBuilder {
GetQueueMetadataBuilder::new(self.clone())
}
pub fn get_acl(&self) -> GetQueueACLBuilder {
GetQueueACLBuilder::new(self.clone())
}
pub fn set_acl(&self, policies: Vec<QueueStoredAccessPolicy>) -> SetQueueACLBuilder {
SetQueueACLBuilder::new(self.clone(), policies)
}
pub fn put_message<S: Into<String>>(&self, message: S) -> PutMessageBuilder {
PutMessageBuilder::new(self.clone(), message.into())
}
pub fn peek_messages(&self) -> PeekMessagesBuilder {
PeekMessagesBuilder::new(self.clone())
}
pub fn get_messages(&self) -> GetMessagesBuilder {
GetMessagesBuilder::new(self.clone())
}
pub fn clear_messages(&self) -> ClearMessagesBuilder {
ClearMessagesBuilder::new(self.clone())
}
pub fn pop_receipt_client(&self, pop_receipt: impl Into<PopReceipt>) -> PopReceiptClient {
PopReceiptClient::new(self.clone(), pop_receipt.into())
}
pub fn queue_name(&self) -> &str {
&self.queue_name
}
pub fn url(&self) -> azure_core::Result<url::Url> {
let mut url = self.service_client.url()?;
url.path_segments_mut()
.expect("invalid base url")
.push(self.queue_name());
Ok(url)
}
pub(crate) fn messages_url(&self) -> azure_core::Result<url::Url> {
let mut url = self.url()?;
url.path_segments_mut()
.expect("invalid base url")
.push("messages");
Ok(url)
}
pub(crate) fn finalize_request(
&self,
url: url::Url,
method: azure_core::Method,
headers: azure_core::headers::Headers,
request_body: Option<azure_core::Body>,
) -> azure_core::Result<Request> {
self.service_client
.finalize_request(url, method, headers, request_body)
}
pub(crate) async fn send(
&self,
context: &mut Context,
request: &mut Request,
) -> azure_core::Result<Response> {
self.service_client.send(context, request).await
}
}
#[cfg(test)]
#[cfg(feature = "test_integration")]
mod integration_tests {
use super::*;
use crate::clients::QueueServiceClientBuilder;
fn get_emulator_client(queue_name: &str) -> QueueClient {
let service_client = QueueServiceClientBuilder::emulator()
.retry(azure_core::RetryOptions::none())
.build();
service_client.queue_client(queue_name)
}
#[tokio::test]
async fn test_create_delete() {
let queue_name = uuid::Uuid::new_v4().to_string();
let queue_client = get_emulator_client(&queue_name);
queue_client
.create()
.await
.expect("create container should succeed");
queue_client
.delete()
.await
.expect("delete container should succeed");
}
#[tokio::test]
async fn test_put_peek_get_message() {
let queue_name = uuid::Uuid::new_v4().to_string();
let queue_client = get_emulator_client(&queue_name);
queue_client
.create()
.await
.expect("create container should succeed");
queue_client
.put_message("Hello")
.await
.expect("put message should succeed");
let mut messages = queue_client
.peek_messages()
.await
.expect("peek messages should succeed");
assert_eq!(
messages.messages.pop().expect("message").message_text,
"Hello"
);
let mut messages = queue_client
.get_messages()
.await
.expect("get messages should succeed");
assert_eq!(
messages.messages.pop().expect("message").message_text,
"Hello"
);
queue_client
.delete()
.await
.expect("delete container should succeed");
}
}