floe-core 0.3.6

Core library for Floe, a YAML-driven technical ingestion tool.
Documentation
use crate::io::format::AcceptedWriteMetrics;

pub const BYTES_PER_MIB: f64 = 1024.0 * 1024.0;
pub const DEFAULT_SMALL_FILE_THRESHOLD_BYTES: u64 = 16 * 1024 * 1024;

pub fn default_small_file_threshold_bytes(target_file_size_bytes: Option<u64>) -> u64 {
    match target_file_size_bytes {
        Some(target) if target > 1 => std::cmp::max(1, target / 2),
        Some(_) => 1,
        None => DEFAULT_SMALL_FILE_THRESHOLD_BYTES,
    }
}

pub fn null_accepted_write_metrics() -> AcceptedWriteMetrics {
    AcceptedWriteMetrics {
        total_bytes_written: None,
        avg_file_size_mb: None,
        small_files_count: None,
    }
}

pub fn summarize_written_file_sizes(
    file_sizes: &[u64],
    files_written: u64,
    small_file_threshold_bytes: u64,
) -> AcceptedWriteMetrics {
    if files_written == 0 {
        return AcceptedWriteMetrics {
            total_bytes_written: Some(0),
            avg_file_size_mb: None,
            small_files_count: Some(0),
        };
    }

    if file_sizes.len() != files_written as usize {
        return null_accepted_write_metrics();
    }

    let total_bytes_written = file_sizes.iter().copied().sum::<u64>();
    let avg_file_size_mb = (total_bytes_written as f64 / files_written as f64) / BYTES_PER_MIB;
    let small_files_count = file_sizes
        .iter()
        .filter(|size| **size < small_file_threshold_bytes)
        .count() as u64;

    AcceptedWriteMetrics {
        total_bytes_written: Some(total_bytes_written),
        avg_file_size_mb: Some(avg_file_size_mb),
        small_files_count: Some(small_files_count),
    }
}