#![allow(dead_code)] #![allow(unused_imports)]
use std::time::Duration;
pub mod env {
pub const USERNAME: &str = "CEDA_USERNAME";
pub const PASSWORD: &str = "CEDA_PASSWORD";
}
pub mod auth {
pub const MIN_USERNAME_LENGTH: usize = 3;
pub const MAX_USERNAME_LENGTH: usize = 50;
#[cfg(unix)]
pub const ENV_FILE_PERMISSIONS: u32 = 0o600;
pub const CEDA_AUTH_BASE_URL: &str = "https://auth.ceda.ac.uk";
pub const CEDA_LOGIN_URL: &str = "https://auth.ceda.ac.uk/account/signin";
pub const CSRF_TOKEN_SELECTOR: &str = "input[name='csrfmiddlewaretoken']";
}
pub mod http {
use super::Duration;
pub const USER_AGENT: &str = "MIDAS-Fetcher/0.1.0 (Climate Research Tool)";
pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(60);
pub const CONNECT_TIMEOUT: Duration = Duration::from_secs(30);
pub const HTTP2_KEEP_ALIVE_INTERVAL: Duration = Duration::from_secs(30);
pub const HTTP2_KEEP_ALIVE_TIMEOUT: Duration = Duration::from_secs(10);
pub const POOL_IDLE_TIMEOUT: Duration = Duration::from_secs(90);
pub const POOL_MAX_PER_HOST: usize = 25;
pub const MAX_REDIRECTS: usize = 10;
}
pub mod limits {
pub const DEFAULT_RATE_LIMIT_RPS: u32 = 15;
pub const WEB_SCRAPING_RATE_LIMIT: u32 = 2;
pub const WEB_SCRAPING_TIMEOUT_SECS: u64 = 30;
pub const MAX_RETRIES: u32 = 3;
pub const RETRY_BASE_DELAY_MS: u64 = 1000;
pub const MAX_BACKOFF_SECS: u64 = 300;
pub const BACKOFF_JITTER_FACTOR: f64 = 0.1;
pub const CIRCUIT_BREAKER_FAILURE_THRESHOLD: u32 = 5;
pub const CIRCUIT_BREAKER_SUCCESS_THRESHOLD: u32 = 2;
pub const CIRCUIT_BREAKER_TIMEOUT_SECS: u64 = 60;
}
pub mod ceda {
pub const BASE_URL: &str = "https://data.ceda.ac.uk";
pub const DATA_PATH: &str = "/neodc/esacci/climate/land_surface_temperature/data";
pub const MANIFEST_BASE_URL: &str = "https://data.ceda.ac.uk/neodc/esacci/climate";
pub const MANIFEST_DOWNLOAD_BASE_URL: &str = "https://data.ceda.ac.uk/neodc/esacci";
pub const TEST_FILE_URL: &str = "https://data.ceda.ac.uk/badc/ukmo-midas-open/data/uk-daily-temperature-obs/dataset-version-202407/devon/01381_twist/qc-version-1/midas-open_uk-daily-temperature-obs_dv-202407_devon_01381_twist_qcv-1_1980.csv";
}
pub mod selectors {
pub const DATASET_LINK_SELECTOR: &str = "a[href*='dataset-version-']";
pub const VERSION_LINK_SELECTOR: &str = "a[href*='version-']";
pub const MANIFEST_LINK_SELECTOR: &str = "a[href$='.txt']";
pub const DIRECTORY_LINK_SELECTOR: &str = "a[href$='/']";
pub const CSV_FILE_SELECTOR: &str = "a[href$='.csv']";
pub const MANIFEST_MD5_SELECTOR: &str = "a[href*='midas-open-v'][href$='-md5s.txt']";
}
pub mod files {
pub const TEMP_FILE_SUFFIX: &str = ".tmp";
pub const BACKUP_FILE_SUFFIX: &str = ".bak";
pub const MANIFEST_FILE_NAME: &str = ".ceda_manifest.json";
pub const MAX_FILE_SIZE_IN_MEMORY: usize = 100 * 1024 * 1024;
pub const DOWNLOAD_CHUNK_SIZE: usize = 8 * 1024;
}
pub mod workers {
use super::Duration;
pub const DEFAULT_WORKER_COUNT: usize = 8;
pub const MAX_WORKER_COUNT: usize = 16;
pub const WORKER_QUEUE_CAPACITY: usize = 256;
pub const CHANNEL_BUFFER_SIZE: usize = 100;
pub const MANIFEST_BATCH_SIZE: usize = 100;
pub const PREFETCH_COUNT: usize = 50;
pub const MAX_PENDING_ITEMS: usize = 50_000;
pub const MAX_RETRIES: u32 = 3;
pub const RETRY_DELAY: Duration = Duration::from_secs(30);
pub const WORK_TIMEOUT: Duration = Duration::from_secs(300);
pub const DEFAULT_PRIORITY: u32 = 100;
pub const HIGH_PRIORITY: u32 = 200;
pub const LOW_PRIORITY: u32 = 50;
}
pub mod progress {
pub const UPDATE_FREQUENCY_MS: u64 = 100;
pub const MAX_UPDATE_HZ: u64 = 10;
pub const ETA_WINDOW_SIZE_SECS: u64 = 60;
pub const MIN_ETA_SAMPLES: usize = 5;
}
pub mod cache {
pub const VERIFICATION_SAMPLE_RATE: f64 = 1.0;
pub const FAST_VERIFICATION: bool = true;
pub const FULL_VERIFICATION: bool = false;
pub const CACHE_INDEX_FILE: &str = ".cache_index.json";
}
pub mod memory {
pub const MAX_MEMORY_PERCENT: f64 = 50.0;
pub const MMAP_BUFFER_SIZE: usize = 64 * 1024;
pub const GC_THRESHOLD: usize = 1000;
}
pub mod logging {
pub const DEFAULT_LOG_LEVEL: &str = "info";
pub const LOG_ROTATION_SIZE: u64 = 10 * 1024 * 1024;
pub const MAX_LOG_FILES: usize = 10;
pub const LOG_FORMAT: &str = "json";
}
pub use auth::{CEDA_AUTH_BASE_URL, CEDA_LOGIN_URL};
pub use ceda::{BASE_URL as CEDA_BASE_URL, TEST_FILE_URL};
pub use env::{PASSWORD as ENV_PASSWORD, USERNAME as ENV_USERNAME};
pub use files::{MANIFEST_FILE_NAME, TEMP_FILE_SUFFIX};
pub use http::{DEFAULT_TIMEOUT as HTTP_TIMEOUT, USER_AGENT};
pub use limits::{DEFAULT_RATE_LIMIT_RPS, MAX_RETRIES, RETRY_BASE_DELAY_MS};
pub use workers::DEFAULT_WORKER_COUNT;