securitydept-realip 0.2.0

Real IP of SecurityDept, a layered authentication and authorization toolkit built as reusable Rust crates.
Documentation
#[cfg(any(feature = "docker", test))]
use crate::config::CustomProviderConfig;
use crate::{error::RealIpResult, extension::ProviderFactoryRegistry};

#[cfg(feature = "docker")]
mod docker;
#[cfg(feature = "kube")]
mod kube;

pub fn register_builtin_provider_factories(
    _registry: &mut ProviderFactoryRegistry,
) -> RealIpResult<()> {
    #[cfg(feature = "docker")]
    _registry.register(docker::DockerProviderFactory)?;

    #[cfg(feature = "kube")]
    _registry.register(kube::KubeProviderFactory)?;

    Ok(())
}

#[cfg(any(feature = "docker", test))]
fn string_list(config: &CustomProviderConfig, key: &str) -> Vec<String> {
    if let Some(value) = config.extra.get(key) {
        if let Some(items) = value.as_array() {
            return items
                .iter()
                .filter_map(|item| item.as_str())
                .map(str::to_string)
                .collect();
        }
        if let Some(item) = value.as_str() {
            return vec![item.to_string()];
        }
    }
    Vec::new()
}

#[cfg(test)]
mod tests {
    use std::collections::BTreeMap;

    use super::string_list;
    use crate::config::CustomProviderConfig;

    #[test]
    fn string_list_accepts_array_and_string_values() {
        let mut extra = BTreeMap::new();
        extra.insert("array".to_string(), serde_json::json!(["a", "b"]));
        extra.insert("single".to_string(), serde_json::json!("value"));

        let config = CustomProviderConfig {
            name: "test".to_string(),
            kind: "custom".to_string(),
            refresh: None,
            timeout: None,
            on_refresh_failure: Default::default(),
            max_stale: None,
            extra,
        };

        assert_eq!(string_list(&config, "array"), vec!["a", "b"]);
        assert_eq!(string_list(&config, "single"), vec!["value"]);
        assert!(string_list(&config, "missing").is_empty());
    }
}