use serde::Deserialize;
use std::env;
use std::fs;
use std::path::Path;
#[derive(Deserialize)]
struct NavConfig {
groups: Vec<NavGroup>,
}
#[derive(Deserialize)]
struct NavGroup {
pages: Vec<String>,
}
pub fn generate_content_map(nav_json_path: &str) {
let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
println!("cargo:rerun-if-changed={nav_json_path}");
let json = fs::read_to_string(nav_json_path)
.unwrap_or_else(|e| panic!("Failed to read {nav_json_path}: {e}"));
let nav: NavConfig = serde_json::from_str(&json)
.unwrap_or_else(|e| panic!("Failed to parse {nav_json_path}: {e}"));
let docs_dir = Path::new(nav_json_path)
.parent()
.and_then(|p| p.to_str())
.unwrap_or("docs");
let mut code = String::from("// Auto-generated by dioxus-docs-kit-build — do not edit\n{\n");
code.push_str(" let mut map = std::collections::HashMap::new();\n");
for group in &nav.groups {
for page in &group.pages {
let mdx_path = format!("{docs_dir}/{page}.mdx");
let full_path = format!("{manifest_dir}/{mdx_path}");
if !Path::new(&full_path).exists() {
println!(
"cargo:warning=Skipping \"{page}\": {mdx_path} not found (OpenAPI endpoints don't need .mdx files)"
);
continue;
}
println!("cargo:rerun-if-changed={mdx_path}");
code.push_str(&format!(
" map.insert(\"{page}\", include_str!(\"{full_path}\"));\n"
));
}
}
code.push_str(" map\n}\n");
let out_dir = env::var("OUT_DIR").unwrap();
let dest = Path::new(&out_dir).join("doc_content_generated.rs");
fs::write(&dest, code).expect("Failed to write generated file");
}
#[derive(Deserialize)]
struct BlogManifest {
posts: Vec<String>,
}
pub fn generate_blog_content_map(manifest_path: &str) {
let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
println!("cargo:rerun-if-changed={manifest_path}");
let json = fs::read_to_string(manifest_path)
.unwrap_or_else(|e| panic!("Failed to read {manifest_path}: {e}"));
let manifest: BlogManifest = serde_json::from_str(&json)
.unwrap_or_else(|e| panic!("Failed to parse {manifest_path}: {e}"));
let blog_dir = Path::new(manifest_path)
.parent()
.and_then(|p| p.to_str())
.unwrap_or("blog");
let mut code = String::from("// Auto-generated by dioxus-docs-kit-build — do not edit\n{\n");
code.push_str(" let mut map = std::collections::HashMap::new();\n");
let manifest_full_path = format!("{manifest_dir}/{manifest_path}");
code.push_str(&format!(
" map.insert(\"__manifest__\", include_str!(\"{manifest_full_path}\"));\n"
));
for slug in &manifest.posts {
let mdx_path = format!("{blog_dir}/{slug}.mdx");
let full_path = format!("{manifest_dir}/{mdx_path}");
if !Path::new(&full_path).exists() {
println!("cargo:warning=Skipping \"{slug}\": {mdx_path} not found");
continue;
}
println!("cargo:rerun-if-changed={mdx_path}");
code.push_str(&format!(
" map.insert(\"{slug}\", include_str!(\"{full_path}\"));\n"
));
}
code.push_str(" map\n}\n");
let out_dir = env::var("OUT_DIR").unwrap();
let dest = Path::new(&out_dir).join("blog_content_generated.rs");
fs::write(&dest, code).expect("Failed to write generated file");
}