use crate::{Flag, OptionalString};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
pub const DEFAULT_ROUTING_TYPE: &str = "auto";
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Routing {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub r#type: Option<OptionalString>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "AcceleratedDHTClient"
)]
pub accelerated_dht_client: Option<Flag>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "LoopbackAddressesOnLanDHT"
)]
pub loopback_addresses_on_lan_dht: Option<Flag>,
#[serde(default)]
pub ignore_providers: Vec<String>,
#[serde(default)]
pub delegated_routers: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub routers: Option<HashMap<String, RouterConfig>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub methods: Option<HashMap<String, MethodConfig>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct RouterConfig {
pub r#type: RouterType,
pub parameters: serde_json::Value,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum RouterType {
Http,
Dht,
Sequential,
Parallel,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum DhtMode {
Server,
Client,
#[default]
Auto,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct MethodConfig {
pub router_name: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct HttpRouterParams {
pub endpoint: String,
#[serde(default)]
pub max_provide_batch_size: i32,
#[serde(default)]
pub max_provide_concurrency: i32,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct DhtRouterParams {
pub mode: DhtMode,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "AcceleratedDHTClient"
)]
pub accelerated_dht_client: Option<bool>,
#[serde(default, rename = "PublicIPNetwork")]
pub public_ip_network: bool,
}
impl Routing {
pub fn routing_type(&self) -> &str {
self.r#type
.as_ref()
.and_then(|t| t.as_str())
.unwrap_or(DEFAULT_ROUTING_TYPE)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_routing_default() {
let routing = Routing::default();
assert_eq!(routing.routing_type(), "auto");
}
#[test]
fn test_router_type_serialization() {
let json = serde_json::to_string(&RouterType::Http).unwrap();
assert_eq!(json, "\"http\"");
}
#[test]
fn test_dht_mode_serialization() {
let json = serde_json::to_string(&DhtMode::Server).unwrap();
assert_eq!(json, "\"server\"");
}
}