use log::error; use serde::{Deserialize, Deserializer}; use alacritty_terminal::config::{failure_default, LOG_TARGET_CONFIG}; use crate::config::bindings::{self, Binding, KeyBinding, MouseBinding}; use crate::config::mouse::Mouse; #[derive(Debug, PartialEq, Deserialize)] pub struct UIConfig { #[serde(default, deserialize_with = "failure_default")] pub mouse: Mouse, /// Keybindings. #[serde(default = "default_key_bindings", deserialize_with = "deserialize_key_bindings")] pub key_bindings: Vec, /// Bindings for the mouse. #[serde(default = "default_mouse_bindings", deserialize_with = "deserialize_mouse_bindings")] pub mouse_bindings: Vec, } impl Default for UIConfig { fn default() -> Self { UIConfig { mouse: Mouse::default(), key_bindings: default_key_bindings(), mouse_bindings: default_mouse_bindings(), } } } fn default_key_bindings() -> Vec { bindings::default_key_bindings() } fn default_mouse_bindings() -> Vec { bindings::default_mouse_bindings() } fn deserialize_key_bindings<'a, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'a>, { deserialize_bindings(deserializer, bindings::default_key_bindings()) } fn deserialize_mouse_bindings<'a, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'a>, { deserialize_bindings(deserializer, bindings::default_mouse_bindings()) } fn deserialize_bindings<'a, D, T>( deserializer: D, mut default: Vec>, ) -> Result>, D::Error> where D: Deserializer<'a>, T: Copy + Eq, Binding: Deserialize<'a>, { let values = Vec::::deserialize(deserializer)?; // Skip all invalid values. let mut bindings = Vec::with_capacity(values.len()); for value in values { match Binding::::deserialize(value) { Ok(binding) => bindings.push(binding), Err(err) => { error!(target: LOG_TARGET_CONFIG, "Problem with config: {}; ignoring binding", err); }, } } // Remove matching default bindings. for binding in bindings.iter() { default.retain(|b| !b.triggers_match(binding)); } bindings.extend(default); Ok(bindings) }