holdon 0.2.1

Wait for anything. Know why if it doesn't.
Documentation
use std::path::Path;
use std::time::Instant;

use super::{Hintable, err_stage, ok_stage};
use crate::diagnostic::{Stage, StageKind};
use crate::target::FileMode;
use crate::util::format_error_chain;

pub(super) async fn probe(path: &Path, mode: FileMode) -> Vec<Stage> {
    let start = Instant::now();
    let stage = match tokio::fs::symlink_metadata(path).await {
        Ok(_) => {
            if matches!(mode, FileMode::Present) {
                ok_stage(StageKind::File, start.elapsed())
            } else {
                err_stage(StageKind::File, start.elapsed(), "path still exists", None)
            }
        }
        Err(e) if e.kind() == std::io::ErrorKind::NotFound => {
            if matches!(mode, FileMode::Absent) {
                ok_stage(StageKind::File, start.elapsed())
            } else {
                err_stage(
                    StageKind::File,
                    start.elapsed(),
                    "path does not exist",
                    None,
                )
            }
        }
        Err(e) => err_stage(
            StageKind::File,
            start.elapsed(),
            format_error_chain(&e),
            e.hint(),
        ),
    };
    vec![stage]
}