use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
pub struct Files {
map: HashMap<String, String>,
base_dir: String,
}
impl Files {
pub fn new(map: &str) -> Self {
let res: Files = serde_json::from_str(map).unwrap();
res
}
pub fn get(&self, path: impl AsRef<str>) -> Option<&str> {
if let Some(path) = self.map.get(path.as_ref()) {
Some(&path[self.base_dir.len()..])
} else {
None
}
}
pub fn get_full_path(&self, path: impl AsRef<str>) -> Option<&String> {
self.map.get(path.as_ref())
}
}
#[cfg(test)]
mod tests {
use std::fs;
use crate::processor::tests::{cleanup, delete_file, runner as processor_runner};
use crate::processor::*;
use crate::CACHE_BUSTER_DATA_FILE;
use super::*;
use std::path::Path;
fn get_full_path_works() {
delete_file();
let types = vec![
mime::IMAGE_PNG,
mime::IMAGE_SVG,
mime::IMAGE_JPEG,
mime::IMAGE_GIF,
];
let config = BusterBuilder::default()
.source("./dist")
.result("/tmp/prodsd2")
.mime_types(types)
.follow_links(true)
.build()
.unwrap();
config.process().unwrap();
let map = fs::read_to_string(CACHE_BUSTER_DATA_FILE).unwrap();
let files = Files::new(&map);
assert!(get_full_path_runner("./dist/log-out.svg", &files));
assert!(get_full_path_runner(
"./dist/a/b/c/d/s/d/svg/credit-card.svg",
&files
));
assert!(!get_full_path_runner("dist/log-out.svg", &files));
assert!(!get_full_path_runner(
"dist/a/b/c/d/s/d/svg/credit-card.svg",
&files
));
cleanup(&config);
}
fn get_full_path_runner(path: &str, files: &Files) -> bool {
if let Some(file) = files.get_full_path(path) {
Path::new(file).exists()
} else {
false
}
}
fn get_works() {
delete_file();
let types = vec![
mime::IMAGE_PNG,
mime::IMAGE_SVG,
mime::IMAGE_JPEG,
mime::IMAGE_GIF,
];
let config = BusterBuilder::default()
.source("./dist")
.result("/tmp/prod5")
.mime_types(types)
.follow_links(true)
.build()
.unwrap();
config.process().unwrap();
let map = fs::read_to_string(CACHE_BUSTER_DATA_FILE).unwrap();
let files = Files::new(&map);
assert!(get_runner("./dist/log-out.svg", &files));
assert!(get_runner("./dist/a/b/c/d/s/d/svg/credit-card.svg", &files));
assert!(!get_runner("dist/log-out.svg", &files));
assert!(!get_runner("dist/a/b/c/d/s/d/svg/credit-card.svg", &files));
cleanup(&config);
}
fn get_runner(path: &str, files: &Files) -> bool {
if let Some(file) = files.get(path) {
let path = Path::new(&files.base_dir).join(&file[1..]);
let path = Path::new(&path);
path.exists()
} else {
false
}
}
#[test]
pub fn runner() {
get_works();
get_full_path_works();
processor_runner();
}
}