diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/macro_processor/deadlinks.rs | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/src/macro_processor/deadlinks.rs b/src/macro_processor/deadlinks.rs index 061f729..f8bf352 100644 --- a/src/macro_processor/deadlinks.rs +++ b/src/macro_processor/deadlinks.rs @@ -1,6 +1,10 @@ use crate::macro_processor::error::SMPError; use crate::macro_processor::macro_processor::MacroProcessorWarning; use crate::macro_processor::MacroProcessor; +use core::cell::OnceCell; +use std::collections::HashMap; + +static mut LINK_CACHE: OnceCell<HashMap<String, (bool, i32, String)>> = OnceCell::new(); /// Warn on dead link pub fn smp_builtin_wodl( @@ -18,26 +22,41 @@ pub fn smp_builtin_wodl( return Ok(macro_name.to_string()); } - let response = match minreq::get(&args[0]).send() { - Ok(s) => s, - Err(e) => { - smp.warnings - .push(MacroProcessorWarning::from_macro_invocation( - macro_name, - args, - format!("Dead link {:#?} ({:#?})!", args[0], e), - )); - return Ok(args[0].to_string()); + let link_cache: &mut HashMap<String, (bool, i32, String)>; + unsafe { + let _ = LINK_CACHE.get_or_init(|| HashMap::new()); + link_cache = LINK_CACHE.get_mut().expect("Init of OnceCell failed!"); + } + + let link_info = match link_cache.get(&args[0]) { + Some(working_link) => working_link.clone(), + None => { + let response = match minreq::get(&args[0]).send() { + Ok(s) => s, + Err(e) => { + smp.warnings + .push(MacroProcessorWarning::from_macro_invocation( + macro_name, + args, + format!("Dead link {:#?} ({:#?})!", args[0], e), + )); + return Ok(args[0].to_string()); + } + }; + let working_link = response.status_code == 200 && response.reason_phrase == "OK"; + let info = (working_link, response.status_code, response.reason_phrase); + link_cache.insert(String::from(&args[0]), info.clone()); + info } }; - if response.status_code != 200 || response.reason_phrase != "OK" { + if !link_info.0 { smp.warnings .push(MacroProcessorWarning::from_macro_invocation( macro_name, args, format!( "Dead link {:#?} ({} {})!", - args[0], response.status_code, response.reason_phrase + args[0], link_info.1, link_info.2 ), )); } |