mod client_builder;
mod condition;
mod http_client;
mod result;
mod rule;
use std::fmt;
use std::str::FromStr;
use crate::operation_context::OperationType;
use crate::resource_context::ResourceType;
pub use client_builder::FaultInjectionClientBuilder;
pub use condition::{FaultInjectionCondition, FaultInjectionConditionBuilder};
pub use result::{
CustomResponse, CustomResponseBuilder, FaultInjectionResult, FaultInjectionResultBuilder,
};
pub use rule::{FaultInjectionRule, FaultInjectionRuleBuilder};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum FaultInjectionErrorType {
InternalServerError,
TooManyRequests,
ReadSessionNotAvailable,
Timeout,
ServiceUnavailable,
PartitionIsGone,
WriteForbidden,
DatabaseAccountNotFound,
ConnectionError,
ResponseTimeout,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum FaultOperationType {
ReadItem,
QueryItem,
CreateItem,
UpsertItem,
ReplaceItem,
DeleteItem,
PatchItem,
BatchItem,
ChangeFeedItem,
MetadataReadContainer,
MetadataReadDatabaseAccount,
MetadataQueryPlan,
MetadataPartitionKeyRanges,
}
impl FaultOperationType {
pub fn as_str(&self) -> &'static str {
match self {
FaultOperationType::ReadItem => "ReadItem",
FaultOperationType::QueryItem => "QueryItem",
FaultOperationType::CreateItem => "CreateItem",
FaultOperationType::UpsertItem => "UpsertItem",
FaultOperationType::ReplaceItem => "ReplaceItem",
FaultOperationType::DeleteItem => "DeleteItem",
FaultOperationType::PatchItem => "PatchItem",
FaultOperationType::BatchItem => "BatchItem",
FaultOperationType::ChangeFeedItem => "ChangeFeedItem",
FaultOperationType::MetadataReadContainer => "MetadataReadContainer",
FaultOperationType::MetadataReadDatabaseAccount => "MetadataReadDatabaseAccount",
FaultOperationType::MetadataQueryPlan => "MetadataQueryPlan",
FaultOperationType::MetadataPartitionKeyRanges => "MetadataPartitionKeyRanges",
}
}
pub fn from_operation_and_resource(
operation_type: &OperationType,
resource_type: &ResourceType,
) -> Option<Self> {
match (operation_type, resource_type) {
(OperationType::Read, ResourceType::Documents) => Some(FaultOperationType::ReadItem),
(OperationType::Query, ResourceType::Documents) => Some(FaultOperationType::QueryItem),
(OperationType::Create, ResourceType::Documents) => {
Some(FaultOperationType::CreateItem)
}
(OperationType::Upsert, ResourceType::Documents) => {
Some(FaultOperationType::UpsertItem)
}
(OperationType::Replace, ResourceType::Documents) => {
Some(FaultOperationType::ReplaceItem)
}
(OperationType::Delete, ResourceType::Documents) => {
Some(FaultOperationType::DeleteItem)
}
(OperationType::Patch, ResourceType::Documents) => Some(FaultOperationType::PatchItem),
(OperationType::Batch, ResourceType::Documents) => Some(FaultOperationType::BatchItem),
(OperationType::ReadFeed, ResourceType::Documents) => {
Some(FaultOperationType::ChangeFeedItem)
}
(OperationType::Read, ResourceType::Containers) => {
Some(FaultOperationType::MetadataReadContainer)
}
(OperationType::Read, ResourceType::DatabaseAccount) => {
Some(FaultOperationType::MetadataReadDatabaseAccount)
}
(OperationType::QueryPlan, ResourceType::Documents) => {
Some(FaultOperationType::MetadataQueryPlan)
}
(OperationType::ReadFeed, ResourceType::PartitionKeyRanges) => {
Some(FaultOperationType::MetadataPartitionKeyRanges)
}
_ => None,
}
}
}
impl fmt::Display for FaultOperationType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
impl FromStr for FaultOperationType {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"ReadItem" => Ok(FaultOperationType::ReadItem),
"QueryItem" => Ok(FaultOperationType::QueryItem),
"CreateItem" => Ok(FaultOperationType::CreateItem),
"UpsertItem" => Ok(FaultOperationType::UpsertItem),
"ReplaceItem" => Ok(FaultOperationType::ReplaceItem),
"DeleteItem" => Ok(FaultOperationType::DeleteItem),
"PatchItem" => Ok(FaultOperationType::PatchItem),
"BatchItem" => Ok(FaultOperationType::BatchItem),
"ChangeFeedItem" => Ok(FaultOperationType::ChangeFeedItem),
"MetadataReadContainer" => Ok(FaultOperationType::MetadataReadContainer),
"MetadataReadDatabaseAccount" => Ok(FaultOperationType::MetadataReadDatabaseAccount),
"MetadataQueryPlan" => Ok(FaultOperationType::MetadataQueryPlan),
"MetadataPartitionKeyRanges" => Ok(FaultOperationType::MetadataPartitionKeyRanges),
_ => Err(()),
}
}
}