cargo-reclaim 0.2.2

Safe Cargo cleanup for target directories, stale artifacts, and Cargo home caches
Documentation
use cargo_reclaim::{
    ArtifactClass, PathKind, PlanAction, PlanSkipReason, PolicyKind, TargetEvidence,
};

pub(super) fn policy_label(policy: PolicyKind) -> &'static str {
    match policy {
        PolicyKind::Observe => "observe",
        PolicyKind::Conservative => "conservative",
        PolicyKind::Balanced => "balanced",
        PolicyKind::Aggressive => "aggressive",
        PolicyKind::Custom => "custom",
    }
}

pub(super) fn action_label(action: &PlanAction) -> &'static str {
    match action {
        PlanAction::Delete => "delete",
        PlanAction::Preserve => "preserve",
        PlanAction::SkipActive => "skip_active",
        PlanAction::SkipLocked => "skip_locked",
        PlanAction::Unknown => "unknown",
        PlanAction::RequiresConfirmation => "requires_confirmation",
    }
}

pub(super) fn artifact_label(artifact_class: ArtifactClass) -> &'static str {
    match artifact_class {
        ArtifactClass::WholeTarget => "whole_target",
        ArtifactClass::Incremental => "incremental",
        ArtifactClass::Deps => "deps",
        ArtifactClass::BuildScripts => "build_scripts",
        ArtifactClass::Fingerprint => "fingerprint",
        ArtifactClass::Docs => "docs",
        ArtifactClass::Package => "package",
        ArtifactClass::Timings => "timings",
        ArtifactClass::Tmp => "tmp",
        ArtifactClass::FingerprintGroupIntermediate => "fingerprint_group_intermediate",
        ArtifactClass::StaleDeps => "stale_deps",
        ArtifactClass::StaleIncremental => "stale_incremental",
        ArtifactClass::DepsOutput => "deps_output",
        ArtifactClass::DepInfo => "dep_info",
        ArtifactClass::ObjectMetadata => "object_metadata",
        ArtifactClass::FinalExecutable => "final_executable",
        ArtifactClass::FinalLibrary => "final_library",
        ArtifactClass::FinalRlib => "final_rlib",
        ArtifactClass::FinalWasm => "final_wasm",
        ArtifactClass::Unknown => "unknown",
    }
}

pub(super) fn path_kind_label(path_kind: PathKind) -> &'static str {
    match path_kind {
        PathKind::File => "file",
        PathKind::Directory => "directory",
        PathKind::Symlink => "symlink",
        PathKind::Unknown => "unknown",
    }
}

pub(super) fn evidence_kind_label(evidence: &TargetEvidence) -> &'static str {
    match evidence {
        TargetEvidence::StrongMarker { .. } => "strong_marker",
        TargetEvidence::ConfiguredPath { .. } => "configured_path",
        TargetEvidence::ProjectContext { .. } => "project_context",
        TargetEvidence::WeakNameOnly { .. } => "weak_name_only",
    }
}

pub(super) fn skip_reason_label(reason: PlanSkipReason) -> &'static str {
    reason.label()
}

#[cfg(test)]
mod tests {
    use cargo_reclaim::{
        ArtifactClass, PathKind, PlanAction, PlanSkipReason, PolicyKind, TargetEvidence,
    };

    use super::{
        action_label, artifact_label, evidence_kind_label, path_kind_label, policy_label,
        skip_reason_label,
    };

    #[test]
    fn labels_cover_current_schema_enums() -> Result<(), Box<dyn std::error::Error>> {
        assert_eq!(policy_label(PolicyKind::Observe), "observe");
        assert_eq!(policy_label(PolicyKind::Conservative), "conservative");
        assert_eq!(policy_label(PolicyKind::Balanced), "balanced");
        assert_eq!(policy_label(PolicyKind::Aggressive), "aggressive");
        assert_eq!(policy_label(PolicyKind::Custom), "custom");

        assert_eq!(action_label(&PlanAction::Delete), "delete");
        assert_eq!(action_label(&PlanAction::Preserve), "preserve");
        assert_eq!(action_label(&PlanAction::SkipActive), "skip_active");
        assert_eq!(action_label(&PlanAction::SkipLocked), "skip_locked");
        assert_eq!(action_label(&PlanAction::Unknown), "unknown");
        assert_eq!(
            action_label(&PlanAction::RequiresConfirmation),
            "requires_confirmation"
        );

        assert_eq!(artifact_label(ArtifactClass::WholeTarget), "whole_target");
        assert_eq!(artifact_label(ArtifactClass::Incremental), "incremental");
        assert_eq!(artifact_label(ArtifactClass::Deps), "deps");
        assert_eq!(artifact_label(ArtifactClass::BuildScripts), "build_scripts");
        assert_eq!(artifact_label(ArtifactClass::Fingerprint), "fingerprint");
        assert_eq!(artifact_label(ArtifactClass::Docs), "docs");
        assert_eq!(artifact_label(ArtifactClass::Package), "package");
        assert_eq!(artifact_label(ArtifactClass::Timings), "timings");
        assert_eq!(artifact_label(ArtifactClass::Tmp), "tmp");
        assert_eq!(
            artifact_label(ArtifactClass::FingerprintGroupIntermediate),
            "fingerprint_group_intermediate"
        );
        assert_eq!(artifact_label(ArtifactClass::StaleDeps), "stale_deps");
        assert_eq!(
            artifact_label(ArtifactClass::StaleIncremental),
            "stale_incremental"
        );
        assert_eq!(artifact_label(ArtifactClass::DepsOutput), "deps_output");
        assert_eq!(artifact_label(ArtifactClass::DepInfo), "dep_info");
        assert_eq!(
            artifact_label(ArtifactClass::ObjectMetadata),
            "object_metadata"
        );
        assert_eq!(
            artifact_label(ArtifactClass::FinalExecutable),
            "final_executable"
        );
        assert_eq!(artifact_label(ArtifactClass::FinalLibrary), "final_library");
        assert_eq!(artifact_label(ArtifactClass::FinalRlib), "final_rlib");
        assert_eq!(artifact_label(ArtifactClass::FinalWasm), "final_wasm");
        assert_eq!(artifact_label(ArtifactClass::Unknown), "unknown");

        assert_eq!(path_kind_label(PathKind::File), "file");
        assert_eq!(path_kind_label(PathKind::Directory), "directory");
        assert_eq!(path_kind_label(PathKind::Symlink), "symlink");
        assert_eq!(path_kind_label(PathKind::Unknown), "unknown");

        assert_eq!(
            evidence_kind_label(&TargetEvidence::strong_marker("CACHEDIR.TAG")?),
            "strong_marker"
        );
        assert_eq!(
            evidence_kind_label(&TargetEvidence::configured_path("config")?),
            "configured_path"
        );
        assert_eq!(
            evidence_kind_label(&TargetEvidence::project_context("Cargo.toml")?),
            "project_context"
        );
        assert_eq!(
            evidence_kind_label(&TargetEvidence::weak_name_only("target")?),
            "weak_name_only"
        );

        assert_eq!(
            skip_reason_label(PlanSkipReason::DefaultIgnoredDir),
            "default_ignored_dir"
        );
        assert_eq!(
            skip_reason_label(PlanSkipReason::ConfiguredIgnoredPath),
            "configured_ignored_path"
        );
        assert_eq!(
            skip_reason_label(PlanSkipReason::SymlinkNotFollowed),
            "symlink_not_followed"
        );
        assert_eq!(
            skip_reason_label(PlanSkipReason::CrossFilesystem),
            "cross_filesystem"
        );
        assert_eq!(
            skip_reason_label(PlanSkipReason::WeakNameOnlySuppressed),
            "weak_name_only_suppressed"
        );
        assert_eq!(
            skip_reason_label(PlanSkipReason::AlreadyVisited),
            "already_visited"
        );
        assert_eq!(
            skip_reason_label(PlanSkipReason::CargoConfigUnsupported),
            "cargo_config_unsupported"
        );
        assert_eq!(
            skip_reason_label(PlanSkipReason::CargoConfigProblem),
            "cargo_config_problem"
        );
        assert_eq!(skip_reason_label(PlanSkipReason::ReadError), "read_error");
        Ok(())
    }
}