cloud_terrastodon_command 0.35.0

Command running helpers for the Cloud Terrastodon project
Documentation
use std::time::Instant;

#[derive(Debug, Default)]
pub enum Loadable<T, E = eyre::Error> {
    #[default]
    NotLoaded,
    Loading {
        started_at: Instant,
    },
    Loaded {
        value: T,
        started_at: Instant,
        finished_at: Instant,
    },
    Failed {
        error: E,
        started_at: Instant,
        finished_at: Instant,
    },
}
impl<T, E> Loadable<T, E> {
    pub fn map<N, F>(self, mapper: F) -> Loadable<N, E>
    where
        F: FnOnce(T) -> N,
    {
        match self {
            Self::Loaded {
                value,
                started_at,
                finished_at,
            } => Loadable::Loaded {
                value: mapper(value),
                started_at,
                finished_at,
            },
            Self::NotLoaded => Loadable::NotLoaded,
            Self::Loading { started_at } => Loadable::Loading { started_at },
            Self::Failed {
                error,
                started_at,
                finished_at,
            } => Loadable::Failed {
                error,
                started_at,
                finished_at,
            },
        }
    }
    pub fn as_loaded(&self) -> Option<&T> {
        match self {
            Self::NotLoaded | Self::Loading { .. } | Self::Failed { .. } => None,
            Self::Loaded { value, .. } => Some(value),
        }
    }
    pub fn as_loaded_mut(&mut self) -> Option<&mut T> {
        match self {
            Self::NotLoaded | Self::Loading { .. } | Self::Failed { .. } => None,
            Self::Loaded { value, .. } => Some(value),
        }
    }
}