wb-cache 0.1.0

Your L1 in-app write-behind cache for various kinds of backends.
Documentation
use std::borrow::Cow;

use indicatif::MultiProgress;
use indicatif::ProgressBar;

#[allow(dead_code)]
pub trait MaybeProgress {
    fn maybe_set_length(&self, len: u64);
    fn maybe_inc(&self, n: u64);
    fn maybe_enable_steady_tick(&self, dur: std::time::Duration);
    fn maybe_finish(&self);
    fn maybe_finish_with_message(&self, msg: impl Into<Cow<'static, str>>);
    fn maybe_set_message(&self, msg: impl Into<Cow<'static, str>>);
    fn maybe_set_prefix(&self, prefix: impl Into<Cow<'static, str>>);
    fn maybe_set_position(&self, pos: u64);
    fn maybe_per_sec(&self) -> f64;
}

impl MaybeProgress for Option<ProgressBar> {
    fn maybe_set_length(&self, len: u64) {
        if let Some(pb) = self {
            pb.set_length(len);
        }
    }

    fn maybe_inc(&self, n: u64) {
        if let Some(pb) = self {
            pb.inc(n);
        }
    }

    fn maybe_enable_steady_tick(&self, dur: std::time::Duration) {
        if let Some(pb) = self {
            pb.enable_steady_tick(dur);
        }
    }

    fn maybe_finish(&self) {
        if let Some(pb) = self {
            pb.finish();
        }
    }

    fn maybe_finish_with_message(&self, msg: impl Into<Cow<'static, str>>) {
        if let Some(pb) = self {
            pb.finish_with_message(msg);
        }
    }

    fn maybe_set_message(&self, msg: impl Into<Cow<'static, str>>) {
        if let Some(pb) = self {
            pb.set_message(msg);
        }
    }

    fn maybe_set_prefix(&self, prefix: impl Into<Cow<'static, str>>) {
        if let Some(pb) = self {
            pb.set_prefix(prefix);
        }
    }

    fn maybe_set_position(&self, pos: u64) {
        if let Some(pb) = self {
            pb.set_position(pos);
        }
    }

    fn maybe_per_sec(&self) -> f64 {
        if let Some(pb) = self {
            pb.per_sec()
        }
        else {
            0.0
        }
    }
}

pub trait MaybeMultiProgress {
    fn maybe_add(&self, pb: ProgressBar) -> Option<ProgressBar>;
    #[allow(dead_code)]
    fn maybe_insert_before(&self, before: Option<&ProgressBar>, pb: ProgressBar) -> Option<ProgressBar>;
    #[allow(dead_code)]
    fn maybe_insert_after(&self, after: Option<&ProgressBar>, pb: ProgressBar) -> Option<ProgressBar>;
    fn maybe_insert_from_back(&self, index: usize, pb: ProgressBar) -> Option<ProgressBar>;
    fn maybe_remove(&self, pb: Option<ProgressBar>);
}

impl MaybeMultiProgress for Option<MultiProgress> {
    fn maybe_add(&self, pb: ProgressBar) -> Option<ProgressBar> {
        self.as_ref().map(|mp| mp.add(pb))
    }

    fn maybe_insert_before(&self, before: Option<&ProgressBar>, pb: ProgressBar) -> Option<ProgressBar> {
        self.as_ref().map(|mp| {
            if let Some(before) = before {
                mp.insert_before(before, pb)
            }
            else {
                mp.add(pb)
            }
        })
    }

    fn maybe_insert_after(&self, after: Option<&ProgressBar>, pb: ProgressBar) -> Option<ProgressBar> {
        if let Some(mp) = self {
            if let Some(after) = after {
                Some(mp.insert_after(after, pb))
            }
            else {
                Some(mp.add(pb))
            }
        }
        else {
            None
        }
    }

    fn maybe_insert_from_back(&self, index: usize, pb: ProgressBar) -> Option<ProgressBar> {
        self.as_ref().map(|mp| mp.insert_from_back(index, pb))
    }

    fn maybe_remove(&self, pb: Option<ProgressBar>) {
        if let Some(mp) = self {
            if let Some(pb) = &pb {
                mp.remove(pb);
            }
        }
    }
}