use crate::diagnostics::RequestSentStatus;
use crate::error::CosmosError;
use crate::models::SubStatusCode;
pub(crate) fn infer_request_sent_status(error: &CosmosError) -> RequestSentStatus {
if error.is_from_wire() {
return RequestSentStatus::Sent;
}
match error.status().sub_status() {
Some(SubStatusCode::AUTHENTICATION_TOKEN_ACQUISITION_FAILED)
| Some(SubStatusCode::CLIENT_GENERATED_401)
| Some(SubStatusCode::TRANSPORT_CONNECTION_FAILED)
| Some(SubStatusCode::TRANSPORT_DNS_FAILED)
| Some(SubStatusCode::TRANSPORT_HTTP2_INCOMPATIBLE) => RequestSentStatus::NotSent,
_ => RequestSentStatus::Unknown,
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::models::CosmosStatus;
fn transport_err(status: CosmosStatus) -> CosmosError {
CosmosError::builder()
.with_status(status)
.with_message("synthetic")
.build()
}
#[test]
fn connection_failed_not_sent() {
let err = transport_err(CosmosStatus::TRANSPORT_CONNECTION_FAILED);
assert_eq!(infer_request_sent_status(&err), RequestSentStatus::NotSent);
}
#[test]
fn dns_failed_not_sent() {
let err = transport_err(CosmosStatus::TRANSPORT_DNS_FAILED);
assert_eq!(infer_request_sent_status(&err), RequestSentStatus::NotSent);
}
#[test]
fn http2_incompatible_not_sent() {
let err = transport_err(CosmosStatus::TRANSPORT_HTTP2_INCOMPATIBLE);
assert_eq!(infer_request_sent_status(&err), RequestSentStatus::NotSent);
}
#[test]
fn generic_transport_io_is_unknown() {
let err = transport_err(CosmosStatus::TRANSPORT_IO_FAILED);
assert_eq!(infer_request_sent_status(&err), RequestSentStatus::Unknown);
}
#[test]
fn client_error_is_unknown() {
let err = CosmosError::builder()
.with_status(crate::error::CosmosStatus::new(
azure_core::http::StatusCode::BadRequest,
))
.with_message("bad input")
.build();
assert_eq!(infer_request_sent_status(&err), RequestSentStatus::Unknown);
}
#[test]
fn serialization_error_is_unknown() {
let err = CosmosError::builder()
.with_status(crate::error::CosmosStatus::SERIALIZATION_RESPONSE_BODY_INVALID)
.with_message("bad json")
.with_source(std::io::Error::other("stub"))
.build();
assert_eq!(infer_request_sent_status(&err), RequestSentStatus::Unknown);
}
#[test]
fn authentication_error_not_sent() {
let err = CosmosError::builder()
.with_status(crate::error::CosmosStatus::AUTHENTICATION_TOKEN_ACQUISITION_FAILED)
.with_message("invalid token")
.build();
assert_eq!(
err.status().sub_status(),
Some(SubStatusCode::AUTHENTICATION_TOKEN_ACQUISITION_FAILED)
);
assert_eq!(infer_request_sent_status(&err), RequestSentStatus::NotSent);
}
}