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(
smp: &mut MacroProcessor,
macro_name: &str,
args: &mut [String],
) -> Result<String, SMPError> {
if args.len() != 1 {
smp.warnings
.push(MacroProcessorWarning::from_macro_invocation(
macro_name,
args,
format!("Wrong number of arguments, expected 1"),
));
return Ok(macro_name.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]).with_timeout(2).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 !link_info.0 {
smp.warnings
.push(MacroProcessorWarning::from_macro_invocation(
macro_name,
args,
format!(
"Dead link {:#?} ({} {})!",
args[0], link_info.1, link_info.2
),
));
}
Ok(args[0].to_string())
}