use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::{
AuthConfig, HttpMethod, PaginationConfig, QueryParamValue, ResilienceConfig, SourceHooksConfig,
};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct SourceConfig {
pub url: String,
#[serde(default)]
pub method: HttpMethod,
#[serde(default)]
pub body: Option<serde_json::Value>,
#[serde(default)]
pub source_label_key: Option<String>,
#[serde(default)]
pub source_label_value: Option<String>,
#[serde(default)]
pub schedule: ScheduleConfig,
#[serde(default)]
pub auth: Option<AuthConfig>,
#[serde(default)]
pub pagination: Option<PaginationConfig>,
#[serde(default)]
pub resilience: Option<ResilienceConfig>,
#[serde(default)]
pub headers: Option<HashMap<String, String>>,
#[serde(default)]
pub max_bytes: Option<u64>,
#[serde(default)]
pub dedupe: Option<DedupeConfig>,
#[serde(default)]
pub response_events_path: Option<String>,
#[serde(default)]
pub response_event_object_path: Option<String>,
#[serde(default)]
pub transform: Option<TransformConfig>,
#[serde(default)]
pub on_cursor_error: Option<CursorExpiredBehavior>,
#[serde(default)]
pub from: Option<String>,
#[serde(default)]
pub from_param: Option<String>,
#[serde(default)]
pub query_params: Option<HashMap<String, QueryParamValue>>,
#[serde(default)]
pub incremental_from: Option<IncrementalFromConfig>,
#[serde(default)]
pub state: Option<SourceStateConfig>,
#[serde(default)]
pub on_parse_error: Option<OnParseErrorBehavior>,
#[serde(default)]
pub priority: Option<u32>,
#[serde(default)]
pub max_response_bytes: Option<u64>,
#[serde(default)]
pub on_invalid_utf8: Option<InvalidUtf8Behavior>,
#[serde(default)]
pub max_line_bytes: Option<u64>,
#[serde(default)]
pub max_line_bytes_behavior: Option<MaxEventBytesBehavior>,
#[serde(default)]
pub checkpoint: Option<CheckpointTiming>,
#[serde(default)]
pub on_state_write_error: Option<OnStateWriteErrorBehavior>,
#[serde(default)]
pub hooks: Option<SourceHooksConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct IncrementalFromConfig {
pub state_key: String,
pub event_timestamp_path: String,
pub param_name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct SourceStateConfig {
pub watermark_field: String,
pub watermark_param: String,
#[serde(default)]
pub state_key: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum OnStateWriteErrorBehavior {
Fail,
SkipCheckpoint,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum InvalidUtf8Behavior {
Replace,
Escape,
Fail,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MaxEventBytesBehavior {
Truncate,
Skip,
Fail,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum CheckpointTiming {
EndOfTick,
PerPage,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum CursorExpiredBehavior {
Reset,
Fail,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum OnParseErrorBehavior {
Skip,
Fail,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct DedupeConfig {
pub id_path: String,
#[serde(default = "default_dedupe_capacity")]
pub capacity: u64,
}
fn default_dedupe_capacity() -> u64 {
100_000
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct TransformConfig {
#[serde(default)]
pub timestamp_field: Option<String>,
#[serde(default)]
pub id_field: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ScheduleConfig {
#[serde(default = "default_interval_secs")]
pub interval_secs: u64,
#[serde(default)]
pub jitter_secs: Option<u64>,
}
fn default_interval_secs() -> u64 {
60
}