summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarpenter, Adam (CORP) <adam.carpenter@adp.com>2021-11-26 16:48:35 -0500
committerCarpenter, Adam (CORP) <adam.carpenter@adp.com>2021-11-26 16:48:35 -0500
commit91d8810402ae8e1173a3c064519c9f1b03e13224 (patch)
tree2eafe9ad60bed8935a42b92890d9af714fb36347
parent3acf604c92b64032885ef27d225efa1307a015ad (diff)
downloadaltruistic-angelshark-91d8810402ae8e1173a3c064519c9f1b03e13224.tar.xz
altruistic-angelshark-91d8810402ae8e1173a3c064519c9f1b03e13224.zip
refactor: simplify by eliminating needless cached for smaller once_cell
-rw-r--r--Cargo.lock2
-rw-r--r--angelsharkd/Cargo.toml8
-rw-r--r--angelsharkd/src/routes/extensions/mod.rs2
-rw-r--r--angelsharkd/src/routes/extensions/simple_search.rs58
4 files changed, 40 insertions, 30 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 255eb5e..cbfb8b3 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -27,10 +27,10 @@ name = "angelsharkd"
version = "0.2.0"
dependencies = [
"anyhow",
- "cached",
"env_logger",
"libangelshark",
"log",
+ "once_cell",
"serde",
"tokio",
"warp",
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!()
}