plow_cli 0.4.8

Plow package management command line applications.
use crate::feedback::{command_failed, Feedback};
use thiserror::Error;

#[derive(Error, Debug)]
pub enum WorkspaceInitializationError {
    #[error("Discovering fields in directory was not successful. Details: {reason:?}")]
    FailedRecursiveListingFields { reason: String },
    #[error("Please run plow init --field @field_namespace/field_name to initialize a field or copy existing fields to this folder then run plow init to initialize the workspace.")]
    NoFieldsInDirectory,
    #[error(
        "Plow couldn't read the workspace manifest (./Plow.toml), either the file does not exist, not readable or corrupted.\n\tDetails: {0}"
    )]
    FailedToReadWorkspaceManifestFile(String),
    #[error(
        "Plow couldn't write the workspace manifest (./Plow.toml), is your workspace read only?\n\tDetails: {0}"
    )]
    FailedToWriteWorkspaceManifestFile(String),
    #[error(
        "Plow couldn't write the fields directory (fields), is your workspace read only?\n\tDetails: {0}"
    )]
    FailedToCreateFieldsDirectory(String),
    #[error(
        "Plow couldn't read the fields directory (fields), could there be permission issues?\n\tDetails: {0}"
    )]
    FailedToReadFieldsDirectory(String),
    #[error(
        "Workspace is already initialized. You may run plow init again to recreate the workspace."
    )]
    WorkspaceAlreadyInitialized,
    #[error(
        "Plow couldn't remove the workspace manifest (./Plow.toml), is your workspace read only?\n\tDetails: {0}"
    )]
    FailedToRemoveWorkspaceManifestFile(String),
    #[error(
        "Plow couldn't remove the fields directory (fields), is your workspace read only?\n\tDetails: {0}"
    )]
    FailedToRemoveFieldsDirectory(String),
    #[error(
        "Failed to remove temporary fields directory. Please remove it manually.\n\tDetails: {0}"
    )]
    FailedToRemoveBackupFieldsDirectory(String),
    #[error(
        "Workspace does not support having a field with the same name multiple times. Please remove or rename the following field: {0}"
    )]
    DuplicateFieldInWorkspace(String),
}

impl Feedback for WorkspaceInitializationError {
    fn feedback(&self) {
        use WorkspaceInitializationError::*;
        match self {
            FailedRecursiveListingFields { .. }
            | NoFieldsInDirectory
            | WorkspaceAlreadyInitialized
            | FailedToCreateFieldsDirectory(_)
            | DuplicateFieldInWorkspace(_)
            | FailedToRemoveBackupFieldsDirectory(_)
            | FailedToReadFieldsDirectory(_)
            | FailedToReadWorkspaceManifestFile(_)
            | FailedToRemoveFieldsDirectory(_)
            | FailedToRemoveWorkspaceManifestFile(_)
            | FailedToWriteWorkspaceManifestFile(_) => {
                command_failed(&format!("{self}"));
            }
        }
    }
}