use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AppConfig {
pub service: ServiceConfig,
#[serde(default)]
pub serialization: SerializationSettings,
pub nats: NatsConfig,
pub venues: Vec<VenueConfig>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct SerializationSettings {
#[serde(default = "default_serialization_format")]
pub format: String,
}
impl Default for SerializationSettings {
#[inline]
fn default() -> Self {
Self {
format: default_serialization_format(),
}
}
}
#[inline]
fn default_serialization_format() -> String {
"json".to_owned()
}
#[derive(Debug, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ServiceConfig {
pub name: String,
#[serde(default = "default_log_level")]
pub log_level: String,
#[serde(default = "default_log_format")]
pub log_format: String,
#[serde(default = "default_shutdown_timeout")]
pub shutdown_timeout_ms: u64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct NatsConfig {
pub urls: Vec<String>,
#[serde(default = "default_connect_timeout")]
pub connect_timeout_ms: u64,
#[serde(default = "default_reconnect_buffer")]
pub reconnect_buffer_size: usize,
#[serde(default = "default_max_reconnects")]
pub max_reconnects: i64,
#[serde(default = "default_ping_interval")]
pub ping_interval_secs: u64,
#[serde(default = "default_auth")]
pub auth: String,
pub token: Option<String>,
pub username: Option<String>,
pub password: Option<String>,
pub credentials_path: Option<String>,
pub nkey_seed: Option<String>,
#[serde(default)]
pub tls: NatsTlsConfig,
#[serde(default)]
pub streams: Vec<StreamConfig>,
#[serde(default)]
pub consumers: Vec<ConsumerConfig>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct NatsTlsConfig {
#[serde(default)]
pub enabled: bool,
pub ca_path: Option<String>,
pub cert_path: Option<String>,
pub key_path: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct StreamConfig {
pub name: String,
pub subjects: Vec<String>,
#[serde(default = "default_storage")]
pub storage: String,
#[serde(default = "default_retention")]
pub retention: String,
#[serde(default)]
pub max_age_secs: u64,
#[serde(default)]
pub max_bytes: i64,
#[serde(default)]
pub max_msgs: i64,
#[serde(default = "default_max_msg_size")]
pub max_msg_size: i32,
#[serde(default = "default_discard")]
pub discard: String,
#[serde(default = "default_num_replicas")]
pub num_replicas: usize,
#[serde(default = "default_duplicate_window")]
pub duplicate_window_secs: u64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ConsumerConfig {
pub stream: String,
pub name: String,
#[serde(default = "default_true")]
pub durable: bool,
#[serde(default = "default_ack_policy")]
pub ack_policy: String,
#[serde(default = "default_ack_wait")]
pub ack_wait_secs: u64,
#[serde(default = "default_max_deliver")]
pub max_deliver: i64,
pub filter_subject: Option<String>,
#[serde(default = "default_deliver_policy")]
pub deliver_policy: String,
pub start_time: Option<String>,
#[serde(default)]
pub max_ack_pending: i64,
#[serde(default)]
pub inactive_threshold_secs: u64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct VenueConfig {
pub id: String,
pub adapter: String,
#[serde(default = "default_true")]
pub enabled: bool,
pub connection: ConnectionConfig,
#[serde(default)]
pub circuit_breaker: Option<CircuitBreakerConfig>,
pub generic_ws: Option<GenericWsConfig>,
pub subscriptions: Vec<SubscriptionConfig>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ConnectionConfig {
pub ws_url: String,
#[serde(default = "default_reconnect_delay")]
pub reconnect_delay_ms: u64,
#[serde(default = "default_max_reconnect_delay")]
pub max_reconnect_delay_ms: u64,
#[serde(default)]
pub max_reconnect_attempts: u64,
#[serde(default = "default_ws_ping_interval")]
pub ping_interval_secs: u64,
#[serde(default = "default_pong_timeout")]
pub pong_timeout_secs: u64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct CircuitBreakerConfig {
#[serde(default = "default_failure_threshold")]
pub failure_threshold: u32,
#[serde(default = "default_reset_timeout")]
pub reset_timeout_secs: u64,
#[serde(default = "default_half_open_max")]
pub half_open_max_requests: u32,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct GenericWsConfig {
pub subscribe_template: Option<String>,
pub batch_subscribe_template: Option<String>,
#[serde(default = "default_stream_format")]
pub stream_format: String,
pub channel_map: std::collections::HashMap<String, String>,
#[serde(default = "default_message_format")]
pub message_format: String,
#[serde(default = "default_subscribe_mode")]
pub subscribe_mode: String,
#[serde(default = "default_args_format")]
pub args_format: String,
#[serde(default)]
pub channel_suffix: std::collections::HashMap<String, String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct SubscriptionConfig {
pub instrument: String,
pub canonical_symbol: String,
pub data_types: Vec<String>,
}
#[inline]
fn default_log_level() -> String {
"info".to_owned()
}
#[inline]
fn default_log_format() -> String {
"json".to_owned()
}
#[inline]
fn default_shutdown_timeout() -> u64 {
5000
}
#[inline]
fn default_connect_timeout() -> u64 {
5000
}
#[inline]
fn default_reconnect_buffer() -> usize {
8_388_608 }
#[inline]
fn default_max_reconnects() -> i64 {
-1
}
#[inline]
fn default_ping_interval() -> u64 {
20
}
#[inline]
fn default_auth() -> String {
"none".to_owned()
}
#[inline]
fn default_storage() -> String {
"file".to_owned()
}
#[inline]
fn default_retention() -> String {
"limits".to_owned()
}
#[inline]
fn default_max_msg_size() -> i32 {
65_536 }
#[inline]
fn default_discard() -> String {
"old".to_owned()
}
#[inline]
fn default_num_replicas() -> usize {
1
}
#[inline]
fn default_duplicate_window() -> u64 {
120
}
#[inline]
fn default_true() -> bool {
true
}
#[inline]
fn default_ack_policy() -> String {
"explicit".to_owned()
}
#[inline]
fn default_ack_wait() -> u64 {
30
}
#[inline]
fn default_max_deliver() -> i64 {
5
}
#[inline]
fn default_deliver_policy() -> String {
"all".to_owned()
}
#[inline]
fn default_reconnect_delay() -> u64 {
1000
}
#[inline]
fn default_max_reconnect_delay() -> u64 {
60_000
}
#[inline]
fn default_ws_ping_interval() -> u64 {
30
}
#[inline]
fn default_pong_timeout() -> u64 {
10
}
#[inline]
fn default_failure_threshold() -> u32 {
5
}
#[inline]
fn default_reset_timeout() -> u64 {
60
}
#[inline]
fn default_half_open_max() -> u32 {
2
}
#[inline]
fn default_message_format() -> String {
"json".to_owned()
}
#[inline]
fn default_stream_format() -> String {
"${instrument}@${channel}".to_owned()
}
#[inline]
fn default_subscribe_mode() -> String {
"per_pair".to_owned()
}
#[inline]
fn default_args_format() -> String {
"string".to_owned()
}