Add check to warn the user about conflicting triggers. Fix #135
This commit is contained in:
parent
dadfb8628e
commit
73c8f5be86
|
@ -48,6 +48,7 @@ fn default_filter_class() -> String{ "".to_owned() }
|
||||||
fn default_filter_exec() -> String{ "".to_owned() }
|
fn default_filter_exec() -> String{ "".to_owned() }
|
||||||
fn default_disabled() -> bool{ false }
|
fn default_disabled() -> bool{ false }
|
||||||
fn default_log_level() -> i32 { 0 }
|
fn default_log_level() -> i32 { 0 }
|
||||||
|
fn default_conflict_check() -> bool{ true }
|
||||||
fn default_ipc_server_port() -> i32 { 34982 }
|
fn default_ipc_server_port() -> i32 { 34982 }
|
||||||
fn default_use_system_agent() -> bool { true }
|
fn default_use_system_agent() -> bool { true }
|
||||||
fn default_config_caching_interval() -> i32 { 800 }
|
fn default_config_caching_interval() -> i32 { 800 }
|
||||||
|
@ -81,6 +82,9 @@ pub struct Configs {
|
||||||
#[serde(default = "default_log_level")]
|
#[serde(default = "default_log_level")]
|
||||||
pub log_level: i32,
|
pub log_level: i32,
|
||||||
|
|
||||||
|
#[serde(default = "default_conflict_check")]
|
||||||
|
pub conflict_check: bool,
|
||||||
|
|
||||||
#[serde(default = "default_ipc_server_port")]
|
#[serde(default = "default_ipc_server_port")]
|
||||||
pub ipc_server_port: i32,
|
pub ipc_server_port: i32,
|
||||||
|
|
||||||
|
@ -144,6 +148,7 @@ impl Configs {
|
||||||
|
|
||||||
validate_field!(result, self.config_caching_interval, default_config_caching_interval());
|
validate_field!(result, self.config_caching_interval, default_config_caching_interval());
|
||||||
validate_field!(result, self.log_level, default_log_level());
|
validate_field!(result, self.log_level, default_log_level());
|
||||||
|
validate_field!(result, self.conflict_check, default_conflict_check());
|
||||||
validate_field!(result, self.toggle_key, KeyModifier::default());
|
validate_field!(result, self.toggle_key, KeyModifier::default());
|
||||||
validate_field!(result, self.toggle_interval, default_toggle_interval());
|
validate_field!(result, self.toggle_interval, default_toggle_interval());
|
||||||
validate_field!(result, self.backspace_limit, default_backspace_limit());
|
validate_field!(result, self.backspace_limit, default_backspace_limit());
|
||||||
|
@ -324,6 +329,18 @@ impl ConfigSet {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if some triggers are conflicting with each other
|
||||||
|
// For more information, see: https://github.com/federico-terzi/espanso/issues/135
|
||||||
|
if default.conflict_check {
|
||||||
|
for s in specific.iter() {
|
||||||
|
let has_conflicts = Self::has_conflicts(&default, &specific);
|
||||||
|
if has_conflicts {
|
||||||
|
eprintln!("Warning: some triggers had conflicts and may not behave as intended");
|
||||||
|
eprintln!("To turn off this check, add \"conflict_check: false\" in the configuration");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Ok(ConfigSet {
|
Ok(ConfigSet {
|
||||||
default,
|
default,
|
||||||
specific
|
specific
|
||||||
|
@ -379,6 +396,42 @@ impl ConfigSet {
|
||||||
|
|
||||||
return ConfigSet::load(config_dir.as_path(), package_dir.as_path());
|
return ConfigSet::load(config_dir.as_path(), package_dir.as_path());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn has_conflicts(default: &Configs, specific: &Vec<Configs>) -> bool {
|
||||||
|
let mut sorted_triggers : Vec<String> = default.matches.iter().map(|t| {
|
||||||
|
t.trigger.clone()
|
||||||
|
}).collect();
|
||||||
|
sorted_triggers.sort();
|
||||||
|
|
||||||
|
let mut has_conflicts = Self::list_has_conflicts(&sorted_triggers);
|
||||||
|
|
||||||
|
for s in specific.iter() {
|
||||||
|
let mut specific_triggers : Vec<String> = s.matches.iter().map(|t| {
|
||||||
|
t.trigger.clone()
|
||||||
|
}).collect();
|
||||||
|
has_conflicts |= Self::list_has_conflicts(&specific_triggers);
|
||||||
|
}
|
||||||
|
|
||||||
|
has_conflicts
|
||||||
|
}
|
||||||
|
|
||||||
|
fn list_has_conflicts(sorted_list: &Vec<String>) -> bool {
|
||||||
|
if sorted_list.len() <= 1 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut has_conflicts = false;
|
||||||
|
|
||||||
|
for (i, item) in sorted_list.iter().skip(1).enumerate() {
|
||||||
|
let previous = &sorted_list[i];
|
||||||
|
if item.starts_with(previous) {
|
||||||
|
has_conflicts = true;
|
||||||
|
eprintln!("Warning: trigger '{}' is conflicting with '{}' and may not behave as intended", item, previous);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
has_conflicts
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait ConfigManager<'a> {
|
pub trait ConfigManager<'a> {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user