website 0.2.0

A self contained website creator and server with zero conf simplicity.
use std::{fs, path::PathBuf};

use anyhow::Result;
use walkdir::WalkDir;
use xxhash_rust::xxh64::xxh64;

pub fn write_files_and_manifest() -> Result<()> {
    let asset_dir = PathBuf::from("assets/");
    let hashed_dir = PathBuf::from("target/assets_hashed/");
    std::fs::create_dir_all(&hashed_dir)?;

    let mut manifest = String::from(
        "pub static ASSET_MANIFEST: phf::Map<&'static str, &'static str> = phf::phf_map! {\n",
    );
    fs::create_dir_all(&hashed_dir)?;

    for entry in WalkDir::new(&asset_dir) {
        let entry = entry?;
        if entry.file_type().is_file() {
            let content = fs::read(entry.path())?;
            let hash = xxh64(&content, 0);
            let original_path = entry
                .path()
                .strip_prefix(&asset_dir)?
                .to_str()
                .unwrap()
                .replace('\\', "/");
            let hashed_name = format!(
                "{}.{:x}.{}",
                entry.path().file_stem().unwrap().to_str().unwrap(),
                hash,
                entry.path().extension().unwrap().to_str().unwrap()
            );
            fs::copy(entry.path(), hashed_dir.join(&hashed_name))?;
            manifest.push_str(&format!("    {:?} => {:?},\n", original_path, hashed_name));
        }
    }

    manifest.push_str("};\n");
    fs::write(
        PathBuf::from("target/generated_asset_manifest.rs"),
        manifest,
    )?;

    Ok(())
}