vein 0.4.0

A fast, intelligent RubyGems proxy/mirror server written in Rust
Documentation
use crate::config::reliability::ReliabilityConfig;
use rama::http::Uri;
use serde::Deserialize;

#[derive(Debug, Clone, Deserialize)]
pub struct UpstreamConfig {
    #[serde(default = "default_upstream_url", with = "serde_url")]
    pub url: Uri,
    #[serde(default, with = "serde_url_vec")]
    pub fallback_urls: Vec<Uri>,
    #[serde(default = "default_timeout_secs")]
    pub timeout_secs: u64,
    #[serde(default = "default_pool_size")]
    pub connection_pool_size: usize,
    #[serde(default)]
    pub reliability: ReliabilityConfig,
}

impl Default for UpstreamConfig {
    fn default() -> Self {
        Self {
            url: default_upstream_url(),
            fallback_urls: Vec::new(),
            timeout_secs: default_timeout_secs(),
            connection_pool_size: default_pool_size(),
            reliability: ReliabilityConfig::default(),
        }
    }
}

fn default_upstream_url() -> Uri {
    Uri::from_static("https://rubygems.org/")
}

fn default_timeout_secs() -> u64 {
    30
}

fn default_pool_size() -> usize {
    128
}

mod serde_url {
    use rama::http::Uri;
    use serde::{Deserialize, Deserializer};
    use std::str::FromStr;

    pub fn deserialize<'de, D>(deserializer: D) -> Result<Uri, D::Error>
    where
        D: Deserializer<'de>,
    {
        let s = String::deserialize(deserializer)?;
        Uri::from_str(&s).map_err(serde::de::Error::custom)
    }
}

mod serde_url_vec {
    use rama::http::Uri;
    use serde::{Deserialize, Deserializer};
    use std::str::FromStr;

    pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<Uri>, D::Error>
    where
        D: Deserializer<'de>,
    {
        let list = Vec::<String>::deserialize(deserializer)?;
        list.into_iter()
            .map(|s| Uri::from_str(&s).map_err(serde::de::Error::custom))
            .collect()
    }
}