use std::fmt::Debug;
use crate::connector::features::shared::rate_limiter::RateLimitConfig;
use crate::connector::{Kind, StreamDescriptor, Venue};
use crate::utils::CorePickPolicy;
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct HttpDescriptor<T> {
pub max_hook_calls_at_once: usize,
pub wait_async_tasks_us: u64,
pub max_pending_actions: Option<usize>,
pub max_pending_events: Option<usize>,
pub core_pick_policy: Option<CorePickPolicy>,
pub rate_limits: Vec<RateLimitConfig>,
pub ctx: Option<T>,
}
impl<T> HttpDescriptor<T> {
pub fn new(
max_hook_calls_at_once: Option<usize>,
wait_async_tasks_us: Option<u64>,
max_pending_actions: Option<usize>,
max_pending_events: Option<usize>,
core_pick_policy: Option<CorePickPolicy>,
rate_limits: Option<Vec<RateLimitConfig>>,
ctx: Option<T>,
) -> Self {
let max_hook_calls_at_once = max_hook_calls_at_once.filter(|&x| x > 0).unwrap_or(10);
let wait_async_tasks_us = wait_async_tasks_us.unwrap_or(100);
Self {
max_hook_calls_at_once,
max_pending_actions,
max_pending_events,
wait_async_tasks_us,
core_pick_policy,
rate_limits: rate_limits.unwrap_or_default(),
ctx,
}
}
pub fn low_latency() -> Self {
Self {
max_hook_calls_at_once: 4,
wait_async_tasks_us: 0, ..Default::default()
}
}
pub fn high_throughput() -> Self {
Self {
max_hook_calls_at_once: 64,
wait_async_tasks_us: 200,
..Default::default()
}
}
pub fn add_rate_limit(&mut self, rate_limit: RateLimitConfig) {
self.rate_limits.push(rate_limit);
}
}
impl<T> Default for HttpDescriptor<T> {
fn default() -> Self {
Self {
max_hook_calls_at_once: 10,
wait_async_tasks_us: 100,
max_pending_actions: None,
max_pending_events: None,
core_pick_policy: None,
rate_limits: vec![],
ctx: None,
}
}
}
impl<T: Debug + Clone + Send + 'static> StreamDescriptor<T> for HttpDescriptor<T> {
fn venue(&self) -> impl Venue {
"any"
}
fn kind(&self) -> impl Kind {
"http"
}
fn max_pending_actions(&self) -> Option<usize> {
self.max_pending_actions
}
fn max_pending_events(&self) -> Option<usize> {
self.max_pending_events
}
fn core_pick_policy(&self) -> Option<CorePickPolicy> {
self.core_pick_policy
}
fn health_at_start(&self) -> bool {
false
}
fn context(&self) -> Option<&T> {
self.ctx.as_ref()
}
}