use crate::operations::*;
use crate::resources::user::UserResponse;
use azure_core::headers::{self, AsHeaders, HeaderValue};
use serde::de::DeserializeOwned;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ConsistencyLevel {
Strong,
Bounded,
Session(String),
ConsistentPrefix,
Eventual,
}
impl ConsistencyLevel {
pub(crate) fn to_consistency_level_header(&self) -> &'static str {
match self {
Self::Strong => "Strong",
Self::Bounded => "Bounded",
Self::Session(_) => "Session",
Self::ConsistentPrefix => "Prefix", Self::Eventual => "Eventual",
}
}
}
macro_rules! implement_from {
($response_type:path) => {
impl From<&$response_type> for ConsistencyLevel {
fn from(a: &$response_type) -> Self {
ConsistencyLevel::Session(a.session_token.clone())
}
}
impl From<$response_type> for ConsistencyLevel {
fn from(a: $response_type) -> Self {
ConsistencyLevel::Session(a.session_token.clone())
}
}
};
($response_type:ident, $generic:tt) => {
impl<$generic> From<&$response_type<$generic>> for ConsistencyLevel {
fn from(a: &$response_type<$generic>) -> Self {
ConsistencyLevel::Session(a.session_token.clone())
}
}
impl<$generic> From<$response_type<$generic>> for ConsistencyLevel {
fn from(a: $response_type<$generic>) -> Self {
ConsistencyLevel::Session(a.session_token.clone())
}
}
};
}
implement_from!(CreateOrReplaceSlugAttachmentResponse);
implement_from!(GetCollectionResponse);
implement_from!(UserResponse);
implement_from!(DeleteAttachmentResponse);
implement_from!(CreateOrReplaceAttachmentResponse);
implement_from!(ListAttachmentsResponse);
implement_from!(GetAttachmentResponse);
implement_from!(CreateDocumentResponse);
implement_from!(ReplaceDocumentResponse);
implement_from!(DeleteDocumentResponse);
implement_from!(CreateOrReplaceUserDefinedFunctionResponse);
implement_from!(DeleteUserDefinedFunctionResponse);
implement_from!(ListUserDefinedFunctionsResponse);
implement_from!(CreateOrReplaceTriggerResponse);
implement_from!(ListTriggersResponse);
implement_from!(DeleteTriggerResponse);
implement_from!(ListDocumentsResponse, T);
implement_from!(QueryDocumentsResponse, T);
impl<T> From<&GetDocumentResponse<T>> for ConsistencyLevel {
fn from(get_document_response: &GetDocumentResponse<T>) -> Self {
match get_document_response {
GetDocumentResponse::Found(response) => {
ConsistencyLevel::Session(response.session_token.clone())
}
GetDocumentResponse::NotFound(response) => {
ConsistencyLevel::Session(response.session_token.clone())
}
}
}
}
impl<T> From<&ExecuteStoredProcedureResponse<T>> for ConsistencyLevel
where
T: DeserializeOwned,
{
fn from(execute_stored_procedure_response: &ExecuteStoredProcedureResponse<T>) -> Self {
ConsistencyLevel::Session(execute_stored_procedure_response.session_token.clone())
}
}
impl AsHeaders for ConsistencyLevel {
type Iter = std::vec::IntoIter<(headers::HeaderName, headers::HeaderValue)>;
fn as_headers(&self) -> Self::Iter {
let mut headers = vec![(
crate::headers::HEADER_CONSISTENCY_LEVEL,
HeaderValue::from_static(self.to_consistency_level_header()),
)];
if let ConsistencyLevel::Session(session_token) = self {
headers.push((crate::headers::HEADER_SESSION_TOKEN, session_token.into()))
}
headers.into_iter()
}
}