mocra-core 0.4.0

The mocra crawler framework runtime: errors, cache, utilities, domain models, downloader, data-plane queue, coordination, scheduler and engine.
Documentation
use crate::common::model::ModuleConfig;
use crate::common::model::config::DownloadConfig as DefaultDownloadConfig;
use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
pub struct DownloadConfig {
    pub enable_session: bool,
    pub enable_locker: bool,
    pub enable_rate_limit: bool,
    pub rate_limit: f32,
    pub cache_ttl: u64,
    pub default_timeout: u32,
    pub downloader: String,
}

impl DownloadConfig {
    pub fn load(
        module_config: &Option<ModuleConfig>,
        default_config: &DefaultDownloadConfig,
    ) -> Self {
        if let Some(module_config) = module_config {
            Self {
                enable_session: module_config
                    .get_config_value("enable_session")
                    .and_then(|x| x.as_bool())
                    .unwrap_or(default_config.enable_session),
                enable_locker: module_config
                    .get_config_value("enable_locker")
                    .and_then(|x| x.as_bool())
                    .unwrap_or(default_config.enable_locker),
                enable_rate_limit: module_config
                    .get_config_value("enable_rate_limit")
                    .and_then(|v| v.as_bool())
                    .unwrap_or(default_config.enable_rate_limit),
                rate_limit: module_config
                    .get_config_value("rate_limit")
                    .and_then(|v| v.as_f64())
                    .unwrap_or(default_config.rate_limit as f64) as f32,
                cache_ttl: module_config
                    .get_config_value("cache_ttl")
                    .and_then(|v| v.as_u64())
                    .unwrap_or(default_config.cache_ttl),
                default_timeout: module_config
                    .get_config_value("default_timeout")
                    .and_then(|v| v.as_u64())
                    .unwrap_or(default_config.timeout as u64)
                    as u32,
                downloader: module_config
                    .get_config_value("downloader")
                    .and_then(|v| v.as_str())
                    .unwrap_or("request_downloader")
                    .to_string(),
            }
        } else {
            Self {
                enable_session: default_config.enable_session,
                enable_locker: default_config.enable_locker,
                enable_rate_limit: default_config.enable_rate_limit,
                rate_limit: default_config.rate_limit,
                cache_ttl: default_config.cache_ttl,
                default_timeout: default_config.timeout,
                downloader: "request_downloader".to_string(),
            }
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::common::model::config::DownloadConfig as DefaultDownloadConfig;

    #[test]
    fn load_should_fallback_to_default_when_module_value_missing() {
        let default_cfg = DefaultDownloadConfig {
            downloader_expire: 3600,
            timeout: 30,
            rate_limit: 12.5,
            enable_session: true,
            enable_locker: true,
            enable_rate_limit: true,
            cache_ttl: 60,
            wss_timeout: 30,
            pool_size: Some(10),
            max_response_size: Some(1024),
        };

        let module_cfg = ModuleConfig::default();
        let loaded = DownloadConfig::load(&Some(module_cfg), &default_cfg);

        assert!(loaded.enable_session);
        assert!(loaded.enable_locker);
        assert!(loaded.enable_rate_limit);
    }

    #[test]
    fn load_should_use_module_bool_when_present() {
        let default_cfg = DefaultDownloadConfig {
            downloader_expire: 3600,
            timeout: 30,
            rate_limit: 12.5,
            enable_session: true,
            enable_locker: true,
            enable_rate_limit: true,
            cache_ttl: 60,
            wss_timeout: 30,
            pool_size: Some(10),
            max_response_size: Some(1024),
        };

        let mut module_cfg = ModuleConfig::default();
        module_cfg.module_config = serde_json::json!({
            "enable_session": false,
            "enable_locker": false,
            "enable_rate_limit": false
        });

        let loaded = DownloadConfig::load(&Some(module_cfg), &default_cfg);

        assert!(!loaded.enable_session);
        assert!(!loaded.enable_locker);
        assert!(!loaded.enable_rate_limit);
    }
}