rust/hg-core/src/config/layer.rs
changeset 52046 28a0eb21ff04
parent 51120 532e74ad3ff6
--- a/rust/hg-core/src/config/layer.rs	Tue Oct 01 13:20:40 2024 +0200
+++ b/rust/hg-core/src/config/layer.rs	Tue Oct 01 13:45:18 2024 +0200
@@ -8,7 +8,7 @@
 // GNU General Public License version 2 or any later version.
 
 use crate::errors::HgError;
-use crate::exit_codes::CONFIG_PARSE_ERROR_ABORT;
+use crate::exit_codes::{CONFIG_ERROR_ABORT, CONFIG_PARSE_ERROR_ABORT};
 use crate::utils::files::{get_bytes_from_path, get_path_from_bytes};
 use format_bytes::{format_bytes, write_bytes, DisplayBytes};
 use lazy_static::lazy_static;
@@ -324,9 +324,7 @@
             ConfigOrigin::Tweakdefaults => {
                 write_bytes!(out, b"ui.tweakdefaults")
             }
-            ConfigOrigin::Defaults => {
-                write_bytes!(out, b"configitems.toml")
-            }
+            ConfigOrigin::Defaults => write_bytes!(out, b"configitems.toml"),
         }
     }
 }
@@ -338,12 +336,49 @@
     pub message: Vec<u8>,
 }
 
+impl From<ConfigParseError> for HgError {
+    fn from(error: ConfigParseError) -> Self {
+        let ConfigParseError {
+            origin,
+            line,
+            message,
+        } = error;
+        let line_message = if let Some(line_number) = line {
+            format_bytes!(b":{}", line_number.to_string().into_bytes())
+        } else {
+            Vec::new()
+        };
+        HgError::Abort {
+            message: String::from_utf8_lossy(&format_bytes!(
+                b"config error at {}{}: {}",
+                origin,
+                line_message,
+                message
+            ))
+            .to_string(),
+            detailed_exit_code: CONFIG_ERROR_ABORT,
+            hint: None,
+        }
+    }
+}
+
 #[derive(Debug, derive_more::From)]
 pub enum ConfigError {
     Parse(ConfigParseError),
     Other(HgError),
 }
 
+impl From<ConfigError> for HgError {
+    fn from(error: ConfigError) -> Self {
+        match error {
+            ConfigError::Parse(config_parse_error) => {
+                Self::from(config_parse_error)
+            }
+            ConfigError::Other(hg_error) => hg_error,
+        }
+    }
+}
+
 fn make_regex(pattern: &'static str) -> Regex {
     Regex::new(pattern).expect("expected a valid regex")
 }