use std::env;
use std::fs;
use std::io;
use std::path::{Path, PathBuf};
pub const MARKDOWN_EXTENSIONS: &[&str] = &[
"md", "markdown", "mdown", "mkdn", "mkd", "mdwn", "mkdown", "ron",
];
pub const ASSET_EXTENSIONS: &[&str] = &[
"png", "jpg", "jpeg", "gif", "svg", "webp", "avif", "ico", "bmp", "tiff",
"js", "css", "map", "woff", "woff2", "ttf", "eot", "mp3", "wav", "ogg", "mp4", "webm",
];
pub const ASSET_BINARY_EXTENSIONS: &[&str] = &[
"png", "jpg", "jpeg", "gif", "webp", "avif", "ico", "bmp", "tiff", "woff", "woff2", "ttf",
"eot", "mp3", "wav", "ogg", "mp4", "webm",
];
pub fn collect_markdown_files<P: AsRef<Path>>(entry_dir: P) -> io::Result<Vec<PathBuf>> {
let current_dir = env::current_dir().unwrap_or(PathBuf::from("."));
let dir_path = current_dir.join(entry_dir.as_ref());
let mut markdown_files: Vec<PathBuf> = Vec::new();
if dir_path.is_dir() {
for entry in fs::read_dir(&dir_path)? {
let entry = entry?;
let path = entry.path();
if path.is_dir() {
let nested = collect_markdown_files(path)?;
markdown_files.extend(nested);
} else if path.is_file()
&& let Some(ext) = path.extension().and_then(|e| e.to_str())
&& MARKDOWN_EXTENSIONS.contains(&ext)
{
markdown_files.push(path);
}
}
}
Ok(markdown_files)
}
pub fn collect_asset_files<P: AsRef<Path>>(entry_dir: P) -> io::Result<Vec<PathBuf>> {
let current_dir = env::current_dir().unwrap_or(PathBuf::from("."));
let dir_path = current_dir.join(entry_dir.as_ref());
let mut asset_files: Vec<PathBuf> = Vec::new();
if dir_path.is_dir() {
for entry in fs::read_dir(&dir_path)? {
let entry = entry?;
let path = entry.path();
if path.is_dir() {
let nested = collect_asset_files(path)?;
asset_files.extend(nested);
} else if path.is_file()
&& let Some(ext) = path.extension().and_then(|e| e.to_str())
&& ASSET_EXTENSIONS.contains(&ext)
{
asset_files.push(path);
}
}
}
Ok(asset_files)
}