drifter 0.1.11

A TUI-based S3 multipart uploader featuring resumable transfers and ClamAV integration.
Documentation
use crate::core::config::Config;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SettingsCategory {
    S3,
    Scanner,
    Performance,
    Theme,
}

pub struct SettingsState {
    pub endpoint: String,
    pub bucket: String,
    pub region: String,
    pub prefix: String,
    pub access_key: String,
    pub secret_key: String,
    pub clamd_host: String,
    pub clamd_port: String,
    pub scan_chunk_size: String,
    pub part_size: String,
    pub concurrency_global: String,
    pub concurrency_upload_parts: String,
    pub concurrency_scan_parts: String,
    pub active_category: SettingsCategory,
    pub selected_field: usize,
    pub editing: bool,
    pub theme: String,
    pub original_theme: Option<String>,
    pub scanner_enabled: bool,
    pub host_metrics_enabled: bool,
    pub delete_source_after_upload: bool,
}

impl SettingsState {
    pub fn from_config(cfg: &Config) -> Self {
        Self {
            endpoint: cfg.s3_endpoint.clone().unwrap_or_default(),
            bucket: cfg.s3_bucket.clone().unwrap_or_default(),
            region: cfg.s3_region.clone().unwrap_or_default(),
            prefix: cfg.s3_prefix.clone().unwrap_or_default(),
            access_key: cfg.s3_access_key.clone().unwrap_or_default(),
            secret_key: cfg.s3_secret_key.clone().unwrap_or_default(),
            clamd_host: cfg.clamd_host.clone(),
            clamd_port: cfg.clamd_port.to_string(),
            scan_chunk_size: cfg.scan_chunk_size_mb.to_string(),
            part_size: cfg.part_size_mb.to_string(),
            concurrency_global: cfg.concurrency_upload_global.to_string(),
            concurrency_upload_parts: cfg.concurrency_upload_parts.to_string(),
            concurrency_scan_parts: cfg.concurrency_scan_parts.to_string(),
            active_category: SettingsCategory::S3,
            selected_field: 0,
            editing: false,
            theme: cfg.theme.clone(),
            original_theme: None,
            scanner_enabled: cfg.scanner_enabled,
            host_metrics_enabled: cfg.host_metrics_enabled,
            delete_source_after_upload: cfg.delete_source_after_upload,
        }
    }

    pub fn apply_to_config(&self, cfg: &mut Config) {
        cfg.s3_endpoint = if self.endpoint.trim().is_empty() {
            None
        } else {
            Some(self.endpoint.trim().to_string())
        };
        cfg.s3_bucket = if self.bucket.trim().is_empty() {
            None
        } else {
            Some(self.bucket.trim().to_string())
        };
        cfg.s3_region = if self.region.trim().is_empty() {
            None
        } else {
            Some(self.region.trim().to_string())
        };
        cfg.s3_prefix = if self.prefix.trim().is_empty() {
            None
        } else {
            Some(self.prefix.trim().to_string())
        };
        cfg.s3_access_key = if self.access_key.trim().is_empty() {
            None
        } else {
            Some(self.access_key.trim().to_string())
        };
        cfg.s3_secret_key = if self.secret_key.trim().is_empty() {
            None
        } else {
            Some(self.secret_key.trim().to_string())
        };
        cfg.clamd_host = self.clamd_host.trim().to_string();
        if let Ok(p) = self.clamd_port.trim().parse() {
            cfg.clamd_port = p;
        }
        if let Ok(v) = self.scan_chunk_size.trim().parse() {
            cfg.scan_chunk_size_mb = v;
        }
        if let Ok(v) = self.part_size.trim().parse() {
            cfg.part_size_mb = v;
        }
        if let Ok(v) = self.concurrency_global.trim().parse() {
            cfg.concurrency_upload_global = v;
        }
        if let Ok(v) = self.concurrency_upload_parts.trim().parse() {
            cfg.concurrency_upload_parts = v;
        }
        if let Ok(v) = self.concurrency_scan_parts.trim().parse() {
            cfg.concurrency_scan_parts = v;
        }
        cfg.theme = self.theme.clone();
        cfg.scanner_enabled = self.scanner_enabled;
        cfg.host_metrics_enabled = self.host_metrics_enabled;
        cfg.delete_source_after_upload = self.delete_source_after_upload;
    }
}