Files
ai-app/server/src/media.rs
T

50 lines
1.4 KiB
Rust

const IMAGE_TYPES: [(&str, &str); 4] = [
("image/png", "png"),
("image/jpeg", "jpg"),
("image/gif", "gif"),
("image/webp", "webp"),
];
/// The extension to store `media_type` under, or `None` if it isn't an
/// image type this server handles.
pub fn extension_for(media_type: &str) -> Option<&'static str> {
IMAGE_TYPES
.iter()
.find(|(known, _)| *known == media_type)
.map(|(_, extension)| *extension)
}
/// The media type of a stored file, from its extension. Names are
/// server-generated (`<hex>.<extension>`, always lowercase), so no case
/// folding is needed; `None` for anything else.
pub fn media_type_for(name: &str) -> Option<&'static str> {
let (_, extension) = name.rsplit_once('.')?;
IMAGE_TYPES
.iter()
.find(|(_, known)| *known == extension)
.map(|(media_type, _)| *media_type)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_two_directions_agree() {
for (media_type, extension) in IMAGE_TYPES {
assert_eq!(extension_for(media_type), Some(extension));
assert_eq!(
media_type_for(&format!("abc123.{extension}")),
Some(media_type)
);
}
}
#[test]
fn unknown_types_are_the_callers_problem() {
assert_eq!(extension_for("application/pdf"), None);
assert_eq!(media_type_for("abc123.pdf"), None);
assert_eq!(media_type_for("abc123"), None);
}
}