use crate::policies::{ExponentialRetryPolicy, FixedRetryPolicy, NoRetryPolicy, Policy};
use crate::HttpClient;
use std::sync::Arc;
use std::time::Duration;
#[derive(Clone, Debug)]
#[cfg_attr(
all(
any(feature = "enable_reqwest", feature = "enable_reqwest_rustls"),
not(target_arch = "wasm32")
),
derive(Default)
)]
pub struct ClientOptions {
pub(crate) per_call_policies: Vec<Arc<dyn Policy>>,
pub(crate) per_retry_policies: Vec<Arc<dyn Policy>>,
pub(crate) retry: RetryOptions,
pub(crate) telemetry: TelemetryOptions,
pub(crate) transport: TransportOptions,
}
impl ClientOptions {
pub fn new(transport: TransportOptions) -> Self {
Self {
per_call_policies: Vec::new(),
per_retry_policies: Vec::new(),
retry: RetryOptions::default(),
telemetry: TelemetryOptions::default(),
transport,
}
}
#[cfg(feature = "mock_transport_framework")]
pub fn new_with_transaction_name(transaction_name: String) -> Self {
Self {
transport: TransportOptions::new_with_transaction_name(transaction_name),
per_call_policies: Vec::new(),
per_retry_policies: Vec::new(),
retry: RetryOptions::default(),
telemetry: TelemetryOptions::default(),
}
}
pub fn per_call_policies_mut(&mut self) -> &mut Vec<Arc<dyn Policy>> {
&mut self.per_call_policies
}
pub fn per_retry_policies_mut(&mut self) -> &mut Vec<Arc<dyn Policy>> {
&mut self.per_retry_policies
}
setters! {
per_call_policies: Vec<Arc<dyn Policy>> => per_call_policies,
per_retry_policies: Vec<Arc<dyn Policy>> => per_retry_policies,
retry: RetryOptions => retry,
telemetry: TelemetryOptions => telemetry,
transport: TransportOptions => transport,
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum RetryMode {
Exponential,
Fixed,
None,
}
impl Default for RetryMode {
fn default() -> Self {
RetryMode::Exponential
}
}
#[derive(Clone, Debug)]
pub struct RetryOptions {
mode: RetryMode,
delay: Duration,
max_retries: u32,
max_delay: Duration,
}
impl RetryOptions {
setters! {
mode: RetryMode => mode,
delay: Duration => delay,
max_retries: u32 => max_retries,
max_delay: Duration => max_delay,
}
}
impl Default for RetryOptions {
fn default() -> Self {
RetryOptions {
mode: RetryMode::default(),
delay: Duration::from_millis(800),
max_retries: 3,
max_delay: Duration::from_secs(60),
}
}
}
impl RetryOptions {
pub(crate) fn to_policy(&self) -> Arc<dyn Policy> {
match self.mode {
RetryMode::Exponential => Arc::new(ExponentialRetryPolicy::new(
self.delay,
self.max_retries,
self.max_delay,
)),
RetryMode::Fixed => Arc::new(FixedRetryPolicy::new(
self.delay,
self.max_retries,
self.max_delay,
)),
RetryMode::None => Arc::new(NoRetryPolicy::default()),
}
}
}
#[derive(Clone, Debug, Default)]
pub struct TelemetryOptions {
pub(crate) application_id: Option<String>,
}
impl TelemetryOptions {
setters! {
application_id: String => Some(application_id),
}
}
#[derive(Clone, Debug)]
pub struct TransportOptions {
pub(crate) http_client: Arc<dyn HttpClient>,
#[cfg(feature = "mock_transport_framework")]
pub(crate) transaction_name: String,
}
impl TransportOptions {
pub fn new(http_client: Arc<dyn HttpClient>) -> Self {
#[allow(unreachable_code)]
Self {
http_client,
#[cfg(feature = "mock_transport_framework")]
transaction_name: String::new(),
}
}
#[cfg(feature = "mock_transport_framework")]
#[cfg(any(feature = "enable_reqwest", feature = "enable_reqwest_rustls"))]
pub fn new_with_transaction_name(transaction_name: String) -> Self {
Self {
http_client: crate::http_client::new_http_client(),
transaction_name,
}
}
}
#[cfg(any(feature = "enable_reqwest", feature = "enable_reqwest_rustls"))]
#[cfg(not(target_arch = "wasm32"))]
impl Default for TransportOptions {
fn default() -> Self {
Self::new(crate::http_client::new_http_client())
}
}