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> = OnceCell::new(); /// Warn on dead link pub fn smp_builtin_wodl( smp: &mut MacroProcessor, macro_name: &str, args: &mut [String], ) -> Result { 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; 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 !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()) }