use std::{borrow::Cow, collections::BTreeMap};
use serde::{Deserialize, Serialize};
use crate::config::{host::parse_upstream_address, RouteHeader, RouteUpstream};
use super::headers::header;
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct UpstreamBlock {
pub weight: Option<i8>,
pub network: Option<String>,
pub sni: Option<String>,
pub headers: Option<UpstreamHeadersBlock>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct UpstreamHeadersBlock {
#[serde(default)]
pub add: BTreeMap<String, String>,
}
impl UpstreamBlock {
pub(super) fn to_upstream(&self, label: &str) -> Result<RouteUpstream, String> {
let (ip, port) = parse_upstream_address(label)?;
Ok(RouteUpstream {
ip: Cow::Owned(ip),
port,
network: self.network.clone(),
weight: self.weight,
sni: self.sni.clone(),
headers: self.headers.as_ref().map(|headers| RouteHeader {
add: Some(
headers
.add
.iter()
.map(|(name, value)| header(name, value))
.collect(),
),
remove: None,
priority: None,
}),
})
}
}