diff options
Diffstat (limited to 'angelsharkd')
-rw-r--r-- | angelsharkd/Cargo.toml | 8 | ||||
-rw-r--r-- | angelsharkd/src/routes/extensions/mod.rs | 2 | ||||
-rw-r--r-- | angelsharkd/src/routes/extensions/simple_search.rs | 58 |
3 files changed, 39 insertions, 29 deletions
diff --git a/angelsharkd/Cargo.toml b/angelsharkd/Cargo.toml index 8e617e7..d532bf9 100644 --- a/angelsharkd/Cargo.toml +++ b/angelsharkd/Cargo.toml @@ -6,7 +6,7 @@ authors = ["Adam T. Carpenter <adam.carpenter@adp.com>"] description = "A HTTP interface into one or more Communication Managers" [features] -simple_search = ["cached"] +simple_search = ["once_cell"] simple_deprov = [] [dependencies.libangelshark] @@ -33,8 +33,6 @@ features = ["derive"] [dependencies.anyhow] version = "1" -[dependencies.cached] +[dependencies.once_cell] optional = true -version = "0.26" -default-features = false -features = ["proc_macro"] +version = "1"
\ No newline at end of file diff --git a/angelsharkd/src/routes/extensions/mod.rs b/angelsharkd/src/routes/extensions/mod.rs index defbca9..5628588 100644 --- a/angelsharkd/src/routes/extensions/mod.rs +++ b/angelsharkd/src/routes/extensions/mod.rs @@ -15,7 +15,7 @@ pub fn filter(config: &Config) -> impl Filter<Extract = impl Reply, Error = Reje #[cfg(feature = "simple_search")] let filters = filters .or(simple_search::search(config)) - .or(simple_search::refresh()); + .or(simple_search::refresh(config)); #[cfg(feature = "simple_deprov")] let filters = filters.or(simple_deprov::filter()); diff --git a/angelsharkd/src/routes/extensions/simple_search.rs b/angelsharkd/src/routes/extensions/simple_search.rs index cf75c60..a92c47c 100644 --- a/angelsharkd/src/routes/extensions/simple_search.rs +++ b/angelsharkd/src/routes/extensions/simple_search.rs @@ -1,16 +1,19 @@ use crate::{config::Config, routes::with_runner}; -use cached::proc_macro::cached; use libangelshark::AcmRunner; -use std::convert::Infallible; +use once_cell::sync::Lazy; +use std::{ + convert::Infallible, + sync::{Arc, Mutex}, +}; use warp::{ body::{content_length_limit, json}, get, path, post, Filter, Rejection, Reply, }; -const CMD_LIST_EXT: &str = "list extension-type"; -const CMD_LIST_STAT: &str = "list station"; +static HAYSTACK_CACHE: Lazy<Haystack> = Lazy::new(Haystack::new); -type Terms = Vec<String>; +/// Collection of search terms +type Needle = Vec<String>; pub fn search(config: &Config) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone { let runner = config.runner.clone(); @@ -19,9 +22,9 @@ pub fn search(config: &Config) -> impl Filter<Extract = impl Reply, Error = Reje path("search") .and(post()) .and(content_length_limit(1024 * 16)) - .and(json::<Terms>()) + .and(json::<Needle>()) .and(with_runner(runner)) - .and_then(handle_simple_search) + .and_then(handle_search) } pub fn refresh(config: &Config) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone { @@ -32,32 +35,41 @@ pub fn refresh(config: &Config) -> impl Filter<Extract = impl Reply, Error = Rej .and_then(handle_refresh) } +async fn handle_search(terms: Needle, runner: AcmRunner) -> Result<impl Reply, Infallible> { + HAYSTACK_CACHE.search(Vec::new()); + Ok("") +} + async fn handle_refresh(runner: AcmRunner) -> Result<impl Reply, Infallible> { - get_extensions_cached(true); + HAYSTACK_CACHE.refresh(); Ok("Refresh scheduled") } -async fn handle_simple_search(terms: Terms, runner: AcmRunner) -> Result<impl Reply, Infallible> { - Ok(get_extensions_cached(false)) +/// A lazy-loaded, asynchronously-refreshed exension-type haystack cache. +struct Haystack { + inner: Arc<Mutex<String>>, } -#[cached] -fn get_extensions_cached(refresh: bool) -> String { - if refresh { +impl Haystack { + fn new() -> Self { + Self { + inner: Arc::new(Mutex::new(String::with_capacity(0))), + } + } + + pub fn search(&self, needle: Needle) -> String { + (*self.inner.lock().unwrap()).clone() + } + + pub fn refresh(&self) { + let inner = self.inner.clone(); tokio::spawn(async move { - std::thread::sleep_ms(10000); + std::thread::sleep_ms(10000); // slow generation here - if let Ok(mut handle) = GET_EXTENSIONS_CACHED.lock() { - handle.cache_clear(); - handle.cache_set(false, String::from("fresh")); + if let Ok(mut handle) = inner.lock() { + *handle = String::from("fresh"); eprintln!("evicted"); } }); } - - String::from("stale") -} - -fn get_extensions(runner: AcmRunner) { - todo!() } |