openconfiguration 1.7.0

OpenConfiguration (OC) is a modular, efficient and flexible approach for the uni-directional exchange of visual e-commerce configurations.
Documentation
use super::{SceneVisitorExtension, Visitor};

/// Visits all defined paths in the scene except for the hashes.
///
/// Only visits paths used by the graphical data.
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);
            }
        );
    }
}