feat(core): cache app info provider results
This commit is contained in:
parent
1713b078be
commit
bf1d17ad7d
56
espanso/src/cli/worker/engine/caches/app_info_provider.rs
Normal file
56
espanso/src/cli/worker/engine/caches/app_info_provider.rs
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* This file is part of espanso.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019-2021 Federico Terzi
|
||||||
|
*
|
||||||
|
* espanso is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* espanso is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with espanso. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
use std::{cell::RefCell, time::{Duration, Instant}};
|
||||||
|
|
||||||
|
use espanso_info::{AppInfo, AppInfoProvider};
|
||||||
|
|
||||||
|
pub struct CachedAppInfoProvider<'a> {
|
||||||
|
app_info_provider: &'a dyn AppInfoProvider,
|
||||||
|
caching_interval: Duration,
|
||||||
|
|
||||||
|
_cached_info: RefCell<Option<(Instant, AppInfo)>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> CachedAppInfoProvider<'a> {
|
||||||
|
pub fn from(app_info_provider: &'a dyn AppInfoProvider, caching_interval: Duration) -> Self {
|
||||||
|
Self {
|
||||||
|
app_info_provider,
|
||||||
|
caching_interval,
|
||||||
|
_cached_info: RefCell::new(None),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> AppInfoProvider for CachedAppInfoProvider<'a> {
|
||||||
|
fn get_info(&self) -> espanso_info::AppInfo {
|
||||||
|
let mut cached_info = self._cached_info.borrow_mut();
|
||||||
|
if let Some((instant, cached_value)) = &*cached_info {
|
||||||
|
if instant.elapsed() < self.caching_interval {
|
||||||
|
// Return cached config
|
||||||
|
return cached_value.clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let info = self.app_info_provider.get_info();
|
||||||
|
*cached_info = Some((Instant::now(), info.clone()));
|
||||||
|
|
||||||
|
info
|
||||||
|
}
|
||||||
|
}
|
20
espanso/src/cli/worker/engine/caches/mod.rs
Normal file
20
espanso/src/cli/worker/engine/caches/mod.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* This file is part of espanso.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019-2021 Federico Terzi
|
||||||
|
*
|
||||||
|
* espanso is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* espanso is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with espanso. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
pub mod app_info_provider;
|
|
@ -49,6 +49,7 @@ use super::secure_input::SecureInputEvent;
|
||||||
pub mod dispatch;
|
pub mod dispatch;
|
||||||
pub mod funnel;
|
pub mod funnel;
|
||||||
pub mod process;
|
pub mod process;
|
||||||
|
mod caches;
|
||||||
mod keyboard_layout_util;
|
mod keyboard_layout_util;
|
||||||
|
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
|
@ -71,15 +72,17 @@ pub fn initialize_and_spawn(
|
||||||
|
|
||||||
let app_info_provider =
|
let app_info_provider =
|
||||||
espanso_info::get_provider().expect("unable to initialize app info provider");
|
espanso_info::get_provider().expect("unable to initialize app info provider");
|
||||||
|
// TODO: read interval from configs?
|
||||||
|
let cached_app_info_provider = caches::app_info_provider::CachedAppInfoProvider::from(&*app_info_provider, std::time::Duration::from_millis(400));
|
||||||
let config_manager =
|
let config_manager =
|
||||||
super::config::ConfigManager::new(&*config_store, &*match_store, &*app_info_provider);
|
super::config::ConfigManager::new(&*config_store, &*match_store, &cached_app_info_provider);
|
||||||
let match_cache = MatchCache::load(&*config_store, &*match_store);
|
let match_cache = MatchCache::load(&*config_store, &*match_store);
|
||||||
|
|
||||||
let modulo_manager = crate::gui::modulo::manager::ModuloManager::new();
|
let modulo_manager = crate::gui::modulo::manager::ModuloManager::new();
|
||||||
let modulo_form_ui = crate::gui::modulo::form::ModuloFormUI::new(&modulo_manager);
|
let modulo_form_ui = crate::gui::modulo::form::ModuloFormUI::new(&modulo_manager);
|
||||||
let modulo_search_ui = crate::gui::modulo::search::ModuloSearchUI::new(&modulo_manager);
|
let modulo_search_ui = crate::gui::modulo::search::ModuloSearchUI::new(&modulo_manager);
|
||||||
|
|
||||||
let context: Box<dyn Context> = Box::new(super::context::DefaultContext::new(&config_manager, &*app_info_provider));
|
let context: Box<dyn Context> = Box::new(super::context::DefaultContext::new(&config_manager, &cached_app_info_provider));
|
||||||
let builtin_matches = super::builtin::get_builtin_matches(&*config_manager.default());
|
let builtin_matches = super::builtin::get_builtin_matches(&*config_manager.default());
|
||||||
let combined_match_cache = CombinedMatchCache::load(&match_cache, &builtin_matches);
|
let combined_match_cache = CombinedMatchCache::load(&match_cache, &builtin_matches);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user