rhg: Add more conversions between error types
authorSimon Sapin <simon.sapin@octobus.net>
Fri, 19 Mar 2021 13:18:53 +0100
changeset 46797 bcdcb4423ae3
parent 46796 38f55ef058fb
child 46798 f51ff655d338
rhg: Add more conversions between error types This allows using the `?` operator in more places, as the next commit does. Differential Revision: https://phab.mercurial-scm.org/D10238
rust/hg-core/src/config/config.rs
rust/hg-core/src/errors.rs
rust/hg-core/src/lib.rs
rust/rhg/src/error.rs
--- a/rust/hg-core/src/config/config.rs	Fri Mar 19 23:51:46 2021 +0100
+++ b/rust/hg-core/src/config/config.rs	Fri Mar 19 13:18:53 2021 +0100
@@ -17,6 +17,7 @@
 use format_bytes::{write_bytes, DisplayBytes};
 use std::collections::HashSet;
 use std::env;
+use std::fmt;
 use std::path::{Path, PathBuf};
 use std::str;
 
@@ -68,6 +69,21 @@
     pub expected_type: &'static str,
 }
 
+impl fmt::Display for ConfigValueParseError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        // TODO: add origin and line number information, here and in
+        // corresponding python code
+        write!(
+            f,
+            "config error: {}.{} is not a {} ('{}')",
+            String::from_utf8_lossy(&self.section),
+            String::from_utf8_lossy(&self.item),
+            self.expected_type,
+            String::from_utf8_lossy(&self.value)
+        )
+    }
+}
+
 impl Config {
     /// Load system and user configuration from various files.
     ///
--- a/rust/hg-core/src/errors.rs	Fri Mar 19 23:51:46 2021 +0100
+++ b/rust/hg-core/src/errors.rs	Fri Mar 19 13:18:53 2021 +0100
@@ -88,25 +88,7 @@
             HgError::UnsupportedFeature(explanation) => {
                 write!(f, "unsupported feature: {}", explanation)
             }
-            HgError::ConfigValueParseError(ConfigValueParseError {
-                origin: _,
-                line: _,
-                section,
-                item,
-                value,
-                expected_type,
-            }) => {
-                // TODO: add origin and line number information, here and in
-                // corresponding python code
-                write!(
-                    f,
-                    "config error: {}.{} is not a {} ('{}')",
-                    String::from_utf8_lossy(section),
-                    String::from_utf8_lossy(item),
-                    expected_type,
-                    String::from_utf8_lossy(value)
-                )
-            }
+            HgError::ConfigValueParseError(error) => error.fmt(f),
         }
     }
 }
--- a/rust/hg-core/src/lib.rs	Fri Mar 19 23:51:46 2021 +0100
+++ b/rust/hg-core/src/lib.rs	Fri Mar 19 13:18:53 2021 +0100
@@ -17,7 +17,8 @@
     dirstate_map::DirstateMap,
     parsers::{pack_dirstate, parse_dirstate, PARENT_SIZE},
     status::{
-        status, BadMatch, BadType, DirstateStatus, StatusError, StatusOptions,
+        status, BadMatch, BadType, DirstateStatus, HgPathCow, StatusError,
+        StatusOptions,
     },
     CopyMap, CopyMapIter, DirstateEntry, DirstateParents, EntryState,
     StateMap, StateMapIter,
--- a/rust/rhg/src/error.rs	Fri Mar 19 23:51:46 2021 +0100
+++ b/rust/rhg/src/error.rs	Fri Mar 19 13:18:53 2021 +0100
@@ -2,11 +2,12 @@
 use crate::ui::UiError;
 use crate::NoRepoInCwdError;
 use format_bytes::format_bytes;
-use hg::config::{ConfigError, ConfigParseError};
+use hg::config::{ConfigError, ConfigParseError, ConfigValueParseError};
 use hg::errors::HgError;
 use hg::repo::RepoError;
 use hg::revlog::revlog::RevlogError;
 use hg::utils::files::get_bytes_from_path;
+use hg::{DirstateError, DirstateMapError, StatusError};
 use std::convert::From;
 
 /// The kind of command error
@@ -61,6 +62,12 @@
     }
 }
 
+impl From<ConfigValueParseError> for CommandError {
+    fn from(error: ConfigValueParseError) -> Self {
+        CommandError::abort(error.to_string())
+    }
+}
+
 impl From<UiError> for CommandError {
     fn from(_error: UiError) -> Self {
         // If we already failed writing to stdout or stderr,
@@ -144,3 +151,24 @@
         }
     }
 }
+
+impl From<StatusError> for CommandError {
+    fn from(error: StatusError) -> Self {
+        CommandError::abort(format!("{}", error))
+    }
+}
+
+impl From<DirstateMapError> for CommandError {
+    fn from(error: DirstateMapError) -> Self {
+        CommandError::abort(format!("{}", error))
+    }
+}
+
+impl From<DirstateError> for CommandError {
+    fn from(error: DirstateError) -> Self {
+        match error {
+            DirstateError::Common(error) => error.into(),
+            DirstateError::Map(error) => error.into(),
+        }
+    }
+}