elio 1.5.1

Snappy, batteries-included terminal file manager with rich previews, inline images, bulk actions, and trash support.
Documentation
use std::env;

const PREVIEW_WORKER_COUNT: usize = 2;
const SEARCH_WORKER_COUNT: usize = 1;
const DIRECTORY_ITEM_COUNT_WORKER_COUNT: usize = 1;
const DIRECTORY_STATS_WORKER_COUNT: usize = 1;
const DIRECTORY_FINGERPRINT_WORKER_COUNT: usize = 1;
const PREVIEW_LINE_COUNT_WORKER_COUNT: usize = 1;
const IMAGE_PREPARE_WORKER_COUNT_MIN: usize = 3;
const IMAGE_PREPARE_WORKER_COUNT_MAX: usize = 6;
const IMAGE_PREPARE_WORKER_COUNT_SLOW_SIXEL_MIN: usize = 1;
const IMAGE_PREPARE_WORKER_COUNT_SLOW_SIXEL_MAX: usize = 2;
const PDF_PROBE_WORKER_COUNT: usize = 2;
const PDF_RENDER_WORKER_COUNT: usize = 2;
const PREVIEW_QUEUE_LIMIT: usize = 8;
const DIRECTORY_ITEM_COUNT_QUEUE_LIMIT: usize = 48;
const PREVIEW_LINE_COUNT_QUEUE_LIMIT: usize = 16;
const IMAGE_PREPARE_QUEUE_LIMIT: usize = 16;
const PDF_PROBE_QUEUE_LIMIT: usize = 16;
const PDF_RENDER_QUEUE_LIMIT: usize = 8;

#[derive(Clone, Copy, Debug)]
pub(super) struct SchedulerConfig {
    pub(super) search_worker_count: usize,
    pub(super) preview_worker_count: usize,
    pub(super) preview_queue_limit: usize,
    pub(super) directory_item_count_worker_count: usize,
    pub(super) directory_item_count_queue_limit: usize,
    pub(super) directory_fingerprint_worker_count: usize,
    pub(super) preview_line_count_worker_count: usize,
    pub(super) preview_line_count_queue_limit: usize,
    pub(super) image_prepare_worker_count: usize,
    pub(super) image_prepare_queue_limit: usize,
    pub(super) pdf_probe_worker_count: usize,
    pub(super) pdf_probe_queue_limit: usize,
    pub(super) pdf_render_worker_count: usize,
    pub(super) pdf_render_queue_limit: usize,
}

impl SchedulerConfig {
    pub(super) fn production() -> Self {
        Self {
            search_worker_count: SEARCH_WORKER_COUNT,
            preview_worker_count: PREVIEW_WORKER_COUNT,
            preview_queue_limit: PREVIEW_QUEUE_LIMIT,
            directory_item_count_worker_count: DIRECTORY_ITEM_COUNT_WORKER_COUNT,
            directory_item_count_queue_limit: DIRECTORY_ITEM_COUNT_QUEUE_LIMIT,
            directory_fingerprint_worker_count: DIRECTORY_FINGERPRINT_WORKER_COUNT,
            preview_line_count_worker_count: PREVIEW_LINE_COUNT_WORKER_COUNT,
            preview_line_count_queue_limit: PREVIEW_LINE_COUNT_QUEUE_LIMIT,
            image_prepare_worker_count: image_prepare_worker_count(),
            image_prepare_queue_limit: IMAGE_PREPARE_QUEUE_LIMIT,
            pdf_probe_worker_count: PDF_PROBE_WORKER_COUNT,
            pdf_probe_queue_limit: PDF_PROBE_QUEUE_LIMIT,
            pdf_render_worker_count: PDF_RENDER_WORKER_COUNT,
            pdf_render_queue_limit: PDF_RENDER_QUEUE_LIMIT,
        }
    }

    #[cfg(test)]
    pub(super) fn for_tests(
        search_worker_count: usize,
        preview_worker_count: usize,
        preview_queue_limit: usize,
    ) -> Self {
        Self {
            search_worker_count,
            preview_worker_count,
            preview_queue_limit,
            directory_item_count_worker_count: DIRECTORY_ITEM_COUNT_WORKER_COUNT,
            directory_item_count_queue_limit: DIRECTORY_ITEM_COUNT_QUEUE_LIMIT,
            directory_fingerprint_worker_count: 0,
            preview_line_count_worker_count: 0,
            preview_line_count_queue_limit: PREVIEW_LINE_COUNT_QUEUE_LIMIT,
            image_prepare_worker_count: 0,
            image_prepare_queue_limit: IMAGE_PREPARE_QUEUE_LIMIT,
            pdf_probe_worker_count: 0,
            pdf_probe_queue_limit: PDF_PROBE_QUEUE_LIMIT,
            pdf_render_worker_count: 0,
            pdf_render_queue_limit: PDF_RENDER_QUEUE_LIMIT,
        }
    }

    pub(super) const fn directory_stats_worker_count(self) -> usize {
        DIRECTORY_STATS_WORKER_COUNT
    }
}

fn image_prepare_worker_count() -> usize {
    let slow_sixel_terminal = matches!(
        env::var("TERM").ok().as_deref(),
        Some("foot") | Some("foot-extra")
    ) || env::var_os("WT_SESSION").is_some();
    std::thread::available_parallelism()
        .map(|count| {
            if slow_sixel_terminal {
                (count.get() / 8).clamp(
                    IMAGE_PREPARE_WORKER_COUNT_SLOW_SIXEL_MIN,
                    IMAGE_PREPARE_WORKER_COUNT_SLOW_SIXEL_MAX,
                )
            } else {
                (count.get() / 4).clamp(
                    IMAGE_PREPARE_WORKER_COUNT_MIN,
                    IMAGE_PREPARE_WORKER_COUNT_MAX,
                )
            }
        })
        .unwrap_or(if slow_sixel_terminal {
            IMAGE_PREPARE_WORKER_COUNT_SLOW_SIXEL_MIN
        } else {
            IMAGE_PREPARE_WORKER_COUNT_MIN
        })
}