pub fn resolve_preview_kind(mime: &str, filename: &str) -> &'static str {
let ext = filename.rsplit('.').next().unwrap_or("").to_lowercase();
match ext.as_str() {
"rs" | "py" | "js" | "ts" | "jsx" | "tsx" | "json" | "toml" | "yaml" | "yml" | "html"
| "css" | "sql" | "sh" | "bash" | "zsh" | "fish" | "md" | "mdx" => return "code",
"txt" | "log" => return "text",
_ => {}
}
if mime.starts_with("image/") {
return "image";
}
if mime == "application/pdf" {
return "pdf";
}
if mime.starts_with("video/") {
return "video";
}
if mime.starts_with("audio/") {
return "audio";
}
if mime.starts_with("text/plain") {
return "text";
}
"download"
}
pub fn file_descriptor(
filename: &str,
size: u64,
mime: &str,
url: &str,
thumbnail_url: Option<&str>,
) -> serde_json::Value {
let preview_kind = resolve_preview_kind(mime, filename);
let language: Option<&str> = if preview_kind == "code" {
Some(filename.rsplit('.').next().unwrap_or("text"))
} else {
None
};
serde_json::json!({
"filename": filename,
"size": size,
"mime": mime,
"preview_kind": preview_kind,
"url": url,
"thumbnail_url": thumbnail_url,
"language": language,
})
}