use super::{SceneVisitorExtension, Visitor};
pub fn visit_urls(scene: &mut crate::Scene, visitor: &mut dyn FnMut(&mut String)) {
let mut visitor = UrlVisitor { visitor };
scene.visit(&mut visitor)
}
struct UrlVisitor<'a> {
visitor: &'a mut dyn FnMut(&mut String),
}
impl<'a> Visitor for UrlVisitor<'a> {
fn visit_path(&mut self, path: &mut String) {
(self.visitor)(path)
}
}
#[cfg(test)]
mod tests {
use crate::support::visit_urls;
fn load_fixture(name: &str) -> Vec<u8> {
let path = std::env::var("CARGO_MANIFEST_DIR")
.unwrap()
.parse::<std::path::PathBuf>()
.unwrap();
let path = path
.join("..")
.join("fixtures")
.join(&format!("{name}.json"));
std::fs::read(path).unwrap()
}
#[test]
fn it_visits_all_urls() {
let base = load_fixture("04-oc-1.3pre-icom");
let mut result = serde_json::from_slice::<crate::Scene>(&base).unwrap();
visit_urls(&mut result, &mut |url| {
*url = format!("https://example.com/{}", url);
});
insta::with_settings!(
{sort_maps => true},
{
insta::assert_json_snapshot!(result);
}
);
}
}