diff --git a/espanso-config/src/matches/group/loader/yaml/mod.rs b/espanso-config/src/matches/group/loader/yaml/mod.rs index 0280aa5..fc66d5e 100644 --- a/espanso-config/src/matches/group/loader/yaml/mod.rs +++ b/espanso-config/src/matches/group/loader/yaml/mod.rs @@ -17,7 +17,14 @@ * along with espanso. If not, see . */ -use crate::{counter::next_id, matches::{ImageEffect, Match, Params, RegexCause, TextFormat, UpperCasingStyle, Value, Variable, group::{path::resolve_imports, MatchGroup}}}; +use crate::{ + counter::next_id, + matches::{ + group::{path::resolve_imports, MatchGroup}, + ImageEffect, Match, Params, RegexCause, TextFormat, TextInjectMode, UpperCasingStyle, Value, + Variable, + }, +}; use anyhow::Result; use log::{error, warn}; use parse::YAMLMatchGroup; @@ -137,17 +144,30 @@ impl TryFrom for Match { .unwrap_or(TriggerCause::default().propagate_case), uppercase_style, }) - } else if let Some(regex) = yaml_match.regex { // TODO: add test case - MatchCause::Regex(RegexCause { - regex, - }) + } else if let Some(regex) = yaml_match.regex { + // TODO: add test case + MatchCause::Regex(RegexCause { regex }) } else { MatchCause::None }; + // TODO: test force_mode/force_clipboard + let force_mode = if let Some(true) = yaml_match.force_clipboard { + Some(TextInjectMode::Clipboard) + } else if let Some(mode) = yaml_match.force_mode { + match mode.to_lowercase().as_str() { + "clipboard" => Some(TextInjectMode::Clipboard), + "keys" => Some(TextInjectMode::Keys), + _ => None, + } + } else { + None + }; + let effect = if yaml_match.replace.is_some() || yaml_match.markdown.is_some() || yaml_match.html.is_some() - { // TODO: test markdown and html cases + { + // TODO: test markdown and html cases let (replace, format) = if let Some(plain) = yaml_match.replace { (plain, TextFormat::Plain) } else if let Some(markdown) = yaml_match.markdown { @@ -164,10 +184,12 @@ impl TryFrom for Match { .into_iter() .map(|var| var.try_into()) .collect(); + MatchEffect::Text(TextEffect { replace, vars: vars?, format, + force_mode, }) } else if let Some(form_layout) = yaml_match.form { // TODO: test form case @@ -201,11 +223,11 @@ impl TryFrom for Match { replace: resolved_layout, vars, format: TextFormat::Plain, + force_mode, }) - } else if let Some(image_path) = yaml_match.image_path { // TODO: test image case - MatchEffect::Image(ImageEffect { - path: image_path, - }) + } else if let Some(image_path) = yaml_match.image_path { + // TODO: test image case + MatchEffect::Image(ImageEffect { path: image_path }) } else { MatchEffect::None }; diff --git a/espanso-config/src/matches/group/loader/yaml/parse.rs b/espanso-config/src/matches/group/loader/yaml/parse.rs index c9d7a8f..80c2307 100644 --- a/espanso-config/src/matches/group/loader/yaml/parse.rs +++ b/espanso-config/src/matches/group/loader/yaml/parse.rs @@ -100,6 +100,9 @@ pub struct YAMLMatch { #[serde(default)] pub force_clipboard: Option, + #[serde(default)] + pub force_mode: Option, + #[serde(default)] pub markdown: Option, diff --git a/espanso-config/src/matches/mod.rs b/espanso-config/src/matches/mod.rs index 5783db5..c2b89c8 100644 --- a/espanso-config/src/matches/mod.rs +++ b/espanso-config/src/matches/mod.rs @@ -141,6 +141,7 @@ pub struct TextEffect { pub replace: String, pub vars: Vec, pub format: TextFormat, + pub force_mode: Option, } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -150,12 +151,19 @@ pub enum TextFormat { Html, } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub enum TextInjectMode { + Keys, + Clipboard, +} + impl Default for TextEffect { fn default() -> Self { Self { replace: String::new(), vars: Vec::new(), format: TextFormat::Plain, + force_mode: None, } } }