feat(core): integrate new built-in modulo with existing interface
This commit is contained in:
		
							parent
							
								
									a7c51fe803
								
							
						
					
					
						commit
						2b5e77e1da
					
				|  | @ -18,50 +18,25 @@ | |||
|  */ | ||||
| 
 | ||||
| use anyhow::Result; | ||||
| use log::{error, info}; | ||||
| use log::{error, warn}; | ||||
| use std::io::Write; | ||||
| use std::process::Command; | ||||
| use thiserror::Error; | ||||
| 
 | ||||
| pub struct ModuloManager { | ||||
|   modulo_path: Option<String>, | ||||
|   is_support_enabled: bool, | ||||
| } | ||||
| 
 | ||||
| impl ModuloManager { | ||||
|   pub fn new() -> Self { | ||||
|     let mut modulo_path: Option<String> = None; | ||||
|     // Check if the `MODULO_PATH` env variable is configured
 | ||||
|     if let Some(_modulo_path) = std::env::var_os("MODULO_PATH") { | ||||
|       info!("using modulo from env variable at {:?}", _modulo_path); | ||||
|       modulo_path = Some(_modulo_path.to_string_lossy().to_string()) | ||||
|     let is_support_enabled = if cfg!(feature = "modulo") { | ||||
|       true | ||||
|     } else { | ||||
|       // Check in the same directory of espanso
 | ||||
|       if let Ok(exe_path) = std::env::current_exe() { | ||||
|         if let Some(parent) = exe_path.parent() { | ||||
|           let possible_path = parent.join("modulo"); | ||||
|           let possible_path = possible_path.to_string_lossy().to_string(); | ||||
|       warn!("this version of espanso doesn't come with modulo support, so graphical features (such as Forms and Search) might not be available"); | ||||
|       false | ||||
|     }; | ||||
| 
 | ||||
|           if let Ok(output) = Command::new(&possible_path).arg("--version").output() { | ||||
|             if output.status.success() { | ||||
|               info!("using modulo from exe directory at {:?}", possible_path); | ||||
|               modulo_path = Some(possible_path); | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
| 
 | ||||
|       // Otherwise check if present in the PATH
 | ||||
|       if modulo_path.is_none() { | ||||
|         if let Ok(output) = Command::new("modulo").arg("--version").output() { | ||||
|           if output.status.success() { | ||||
|             info!("using modulo executable found in PATH"); | ||||
|             modulo_path = Some("modulo".to_owned()); | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     Self { modulo_path } | ||||
|     Self { is_support_enabled } | ||||
|   } | ||||
| 
 | ||||
|   // pub fn is_valid(&self) -> bool {
 | ||||
|  | @ -80,10 +55,13 @@ impl ModuloManager { | |||
|   // }
 | ||||
| 
 | ||||
|   pub fn invoke(&self, args: &[&str], body: &str) -> Result<String> { | ||||
|     if let Some(modulo_path) = &self.modulo_path { | ||||
|       let mut command = Command::new(modulo_path); | ||||
|     if self.is_support_enabled { | ||||
|       let exec_path = std::env::current_exe().expect("unable to obtain current exec path"); | ||||
|       let mut command = Command::new(exec_path); | ||||
|       let mut full_args = vec!["modulo"]; | ||||
|       full_args.extend(args); | ||||
|       command | ||||
|         .args(args) | ||||
|         .args(full_args) | ||||
|         .stdin(std::process::Stdio::piped()) | ||||
|         .stdout(std::process::Stdio::piped()) | ||||
|         .stderr(std::process::Stdio::piped()); | ||||
|  | @ -109,37 +87,37 @@ impl ModuloManager { | |||
|                     } | ||||
| 
 | ||||
|                     if !output.trim().is_empty() { | ||||
|                       return Ok(output.to_string()); | ||||
|                       Ok(output.to_string()) | ||||
|                     } else { | ||||
|                       return Err(ModuloError::EmptyOutput.into()); | ||||
|                       Err(ModuloError::EmptyOutput.into()) | ||||
|                     } | ||||
|                   } | ||||
|                   Err(error) => { | ||||
|                     return Err(ModuloError::Error(error).into()); | ||||
|                     Err(ModuloError::Error(error).into()) | ||||
|                   } | ||||
|                 } | ||||
|               } | ||||
|               Err(error) => { | ||||
|                 return Err(ModuloError::Error(error).into()); | ||||
|                 Err(ModuloError::Error(error).into()) | ||||
|               } | ||||
|             } | ||||
|           } else { | ||||
|             return Err(ModuloError::StdinError.into()); | ||||
|             Err(ModuloError::StdinError.into()) | ||||
|           } | ||||
|         } | ||||
|         Err(error) => { | ||||
|           return Err(ModuloError::Error(error).into()); | ||||
|           Err(ModuloError::Error(error).into()) | ||||
|         } | ||||
|       } | ||||
|     } else { | ||||
|       return Err(ModuloError::MissingModulo.into()); | ||||
|       Err(ModuloError::MissingModulo.into()) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| #[derive(Error, Debug)] | ||||
| pub enum ModuloError { | ||||
|   #[error("attempt to invoke modulo even though it's not configured")] | ||||
|   #[error("attempt to invoke modulo, but this version of espanso is not compiled with support for it")] | ||||
|   MissingModulo, | ||||
| 
 | ||||
|   #[error("modulo returned an empty output")] | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user