view rust/rhg/src/error.rs @ 45050:18f8d3b31baa

rhg: add a limited `rhg root` subcommand Clap has been choosen for argument parsing for the following reasons: - it's a wildly used and maintained crate - it can deal with OS encoding making it suitable for any encoding - it supports nonambiguous prefix matching as already available in hg - it will soon allow for structopts-style declarative pattern instead of the currently used builder pattern Differential Revision: https://phab.mercurial-scm.org/D8613
author Antoine Cezar <antoine.cezar@octobus.net>
date Tue, 07 Jul 2020 14:05:15 +0530
parents 513b3ef277a3
children 227281e76c22
line wrap: on
line source

use crate::exitcode;
use crate::ui::UiError;
use std::convert::From;

/// The kind of command error
#[derive(Debug, PartialEq)]
pub enum CommandErrorKind {
    /// The command finished without error
    Ok,
    /// The root of the repository cannot be found
    RootNotFound,
    /// The current directory cannot be found
    CurrentDirNotFound,
    /// The standard output stream cannot be written to
    StdoutError,
    /// The standard error stream cannot be written to
    StderrError,
}

impl CommandErrorKind {
    pub fn get_exit_code(&self) -> exitcode::ExitCode {
        match self {
            CommandErrorKind::Ok => exitcode::OK,
            CommandErrorKind::RootNotFound => exitcode::ABORT,
            CommandErrorKind::CurrentDirNotFound => exitcode::ABORT,
            CommandErrorKind::StdoutError => exitcode::ABORT,
            CommandErrorKind::StderrError => exitcode::ABORT,
        }
    }
}

/// The error type for the Command trait
#[derive(Debug, PartialEq)]
pub struct CommandError {
    pub kind: CommandErrorKind,
}

impl CommandError {
    /// Exist the process with the corresponding exit code.
    pub fn exit(&self) -> () {
        std::process::exit(self.kind.get_exit_code())
    }
}

impl From<CommandErrorKind> for CommandError {
    fn from(kind: CommandErrorKind) -> Self {
        CommandError { kind }
    }
}

impl From<UiError> for CommandError {
    fn from(error: UiError) -> Self {
        CommandError {
            kind: match error {
                UiError::StdoutError(_) => CommandErrorKind::StdoutError,
                UiError::StderrError(_) => CommandErrorKind::StderrError,
            },
        }
    }
}