keymap_ui: Don't panic on `KeybindSource::from_meta` (#34652)

Ben Kunkle created

Closes #ISSUE

Log error instead of panicking when `from_meta` is passed an invalid
value

Release Notes:

- N/A *or* Added/Fixed/Improved ...

Change summary

crates/settings/src/keymap_file.rs    | 10 +++++++---
crates/settings_ui/src/keybindings.rs |  5 ++++-
2 files changed, 11 insertions(+), 4 deletions(-)

Detailed changes

crates/settings/src/keymap_file.rs 🔗

@@ -992,13 +992,17 @@ impl KeybindSource {
     }
 
     pub fn from_meta(index: KeyBindingMetaIndex) -> Self {
-        match index {
+        Self::try_from_meta(index).unwrap()
+    }
+
+    pub fn try_from_meta(index: KeyBindingMetaIndex) -> Result<Self> {
+        Ok(match index {
             Self::USER => KeybindSource::User,
             Self::BASE => KeybindSource::Base,
             Self::DEFAULT => KeybindSource::Default,
             Self::VIM => KeybindSource::Vim,
-            _ => unreachable!(),
-        }
+            _ => anyhow::bail!("Invalid keybind source {:?}", index),
+        })
     }
 }
 

crates/settings_ui/src/keybindings.rs 🔗

@@ -567,7 +567,10 @@ impl KeymapEditor {
         let mut string_match_candidates = Vec::new();
 
         for key_binding in key_bindings {
-            let source = key_binding.meta().map(settings::KeybindSource::from_meta);
+            let source = key_binding
+                .meta()
+                .map(settings::KeybindSource::try_from_meta)
+                .and_then(|source| source.log_err());
 
             let keystroke_text = ui::text_for_keystrokes(key_binding.keystrokes(), cx);
             let ui_key_binding = Some(