From fd455a1ae46d8fe90c87ef8811c89427a6292dcf Mon Sep 17 00:00:00 2001 From: Solomon Jacobs Date: Sun, 31 Mar 2024 15:44:17 +0200 Subject: [PATCH] feat: readable toml parsing error (#854) Previously, the yazi displayed the following error. ``` Backtrace omitted. Run with RUST_BACKTRACE=1 to display it. Run with RUST_BACKTRACE=full to include source snippets. The application panicked (crashed). called `Result::unwrap()` on an `Err` value: Error { inner: Error { inner: TomlError { message: "invalid key", raw: Some("{ mime = \"application/octet-stream\",\nuse = [ \"extract_zlib\", \"reveal\" ] }\n"), keys: [], span: Some(0..1) } } } in yazi-config/src/preset.rs, line 42 thread: main ``` It now displays the following message instead: ``` Error: Loading "/home/solo/.config/yazi/yazi.toml" Caused by: TOML parse error at line 1, column 1 | 1 | { mime = "application/octet-stream", | ^ invalid key ``` For more information see issue GH-847. --------- Co-authored-by: sxyazi --- yazi-config/src/lib.rs | 9 +++++---- yazi-config/src/preset.rs | 35 +++++++++++++++++------------------ yazi-fm/src/main.rs | 2 +- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/yazi-config/src/lib.rs b/yazi-config/src/lib.rs index 5c699292..5b6b0798 100644 --- a/yazi-config/src/lib.rs +++ b/yazi-config/src/lib.rs @@ -47,11 +47,11 @@ pub static INPUT: RoCell = RoCell::new(); pub static SELECT: RoCell = RoCell::new(); pub static WHICH: RoCell = RoCell::new(); -pub fn init() { +pub fn init() -> anyhow::Result<()> { let config_dir = Xdg::config_dir(); - MERGED_YAZI.init(Preset::yazi(&config_dir)); - MERGED_KEYMAP.init(Preset::keymap(&config_dir)); - MERGED_THEME.init(Preset::theme(&config_dir)); + MERGED_YAZI.init(Preset::yazi(&config_dir)?); + MERGED_KEYMAP.init(Preset::keymap(&config_dir)?); + MERGED_THEME.init(Preset::theme(&config_dir)?); LAYOUT.with(Default::default); @@ -81,4 +81,5 @@ Add `disable_exec_warn = true` to your `yazi.toml` under `[headsup]` to suppress "# ); } + Ok(()) } diff --git a/yazi-config/src/preset.rs b/yazi-config/src/preset.rs index 0560c4a1..317c8fd4 100644 --- a/yazi-config/src/preset.rs +++ b/yazi-config/src/preset.rs @@ -1,6 +1,6 @@ use std::{mem, path::{Path, PathBuf}}; -use anyhow::Context; +use anyhow::{anyhow, Context, Result}; use toml::{Table, Value}; use crate::theme::Flavor; @@ -8,28 +8,27 @@ use crate::theme::Flavor; pub(crate) struct Preset; impl Preset { - pub(crate) fn yazi(p: &Path) -> String { + pub(crate) fn yazi(p: &Path) -> Result { Self::merge_path(p.join("yazi.toml"), include_str!("../preset/yazi.toml")) } - pub(crate) fn keymap(p: &Path) -> String { + pub(crate) fn keymap(p: &Path) -> Result { Self::merge_path(p.join("keymap.toml"), include_str!("../preset/keymap.toml")) } - pub(crate) fn theme(p: &Path) -> String { + pub(crate) fn theme(p: &Path) -> Result { let Ok(user) = std::fs::read_to_string(p.join("theme.toml")) else { - return include_str!("../preset/theme.toml").to_owned(); + return Ok(include_str!("../preset/theme.toml").to_owned()); }; let Some(use_) = Flavor::parse_use(&user) else { return Self::merge_str(&user, include_str!("../preset/theme.toml")); }; - let p = p.join(format!("flavors/{}.yazi/flavor.toml", use_)); - let flavor = std::fs::read_to_string(&p) - .with_context(|| format!("Failed to load flavor {:?}", p)) - .unwrap(); + let p = p.join(format!("flavors/{use_}.yazi/flavor.toml")); + let flavor = + std::fs::read_to_string(&p).with_context(|| anyhow!("Failed to load flavor {p:?}"))?; - Self::merge_str(&user, &Self::merge_str(&flavor, include_str!("../preset/theme.toml"))) + Self::merge_str(&user, &Self::merge_str(&flavor, include_str!("../preset/theme.toml"))?) } #[inline] @@ -38,21 +37,21 @@ impl Preset { } #[inline] - pub(crate) fn merge_str(user: &str, base: &str) -> String { - let mut t = user.parse().unwrap(); - Self::merge(&mut t, base.parse().unwrap(), 2); + pub(crate) fn merge_str(user: &str, base: &str) -> Result { + let mut t = user.parse()?; + Self::merge(&mut t, base.parse()?, 2); - t.to_string() + Ok(t.to_string()) } #[inline] - fn merge_path(user: PathBuf, base: &str) -> String { - let s = std::fs::read_to_string(user).unwrap_or_default(); + fn merge_path(user: PathBuf, base: &str) -> Result { + let s = std::fs::read_to_string(&user).unwrap_or_default(); if s.is_empty() { - return base.to_string(); + return Ok(base.to_string()); } - Self::merge_str(&s, base) + Self::merge_str(&s, base).with_context(|| anyhow!("Loading {user:?}")) } fn merge(a: &mut Table, b: Table, max: u8) { diff --git a/yazi-fm/src/main.rs b/yazi-fm/src/main.rs index b60d3b52..92e6782c 100644 --- a/yazi-fm/src/main.rs +++ b/yazi-fm/src/main.rs @@ -39,7 +39,7 @@ async fn main() -> anyhow::Result<()> { _ = fdlimit::raise_fd_limit(); - yazi_config::init(); + yazi_config::init()?; yazi_adaptor::init();