Rustでファイル名からContentTypeを決定する

JavaにはURLConnectionにguessContentTypeFromNameというメソッドがあり、ファイル名からContentTypeを決定しようとしてくれます。

Rustには似たようなものがないかと調べていたところ、RustのWebフレームワークであるRocketContentType::from_extensionを使えば同等のことが行えます。自分で書いていると抜けの調査だけでかなりの時間がかかるので、ここは一つこれを利用させてもらって、代わりにテストをしっかりかけば良いかと思います。

use rocket::http::ContentType;

fn main() {
    assert_eq!(ContentType::from_extension("txt"), Some(ContentType::Plain));
    assert_eq!(ContentType::from_extension("html"), Some(ContentType::HTML));
    assert_eq!(ContentType::from_extension("htm"), Some(ContentType::HTML));
    assert_eq!(ContentType::from_extension("xml"), Some(ContentType::XML));
    assert_eq!(ContentType::from_extension("csv"), Some(ContentType::CSV));
    assert_eq!(ContentType::from_extension("js"), Some(ContentType::JavaScript));
    assert_eq!(ContentType::from_extension("css"), Some(ContentType::CSS));
    assert_eq!(ContentType::from_extension("json"), Some(ContentType::JSON));
    assert_eq!(ContentType::from_extension("png"), Some(ContentType::PNG));
    assert_eq!(ContentType::from_extension("gif"), Some(ContentType::GIF));
    assert_eq!(ContentType::from_extension("bmp"), Some(ContentType::BMP));
    assert_eq!(ContentType::from_extension("jpeg"), Some(ContentType::JPEG));
    assert_eq!(ContentType::from_extension("jpg"), Some(ContentType::JPEG));
    assert_eq!(ContentType::from_extension("webp"), Some(ContentType::WEBP));
    assert_eq!(ContentType::from_extension("svg"), Some(ContentType::SVG));
    assert_eq!(ContentType::from_extension("ico"), Some(ContentType::Icon));
    assert_eq!(ContentType::from_extension("flac"), Some(ContentType::FLAC));
    assert_eq!(ContentType::from_extension("wav"), Some(ContentType::WAV));
    assert_eq!(ContentType::from_extension("webm"), Some(ContentType::WEBM));
    assert_eq!(ContentType::from_extension("weba"), Some(ContentType::WEBA));
    assert_eq!(ContentType::from_extension("ogg"), Some(ContentType::OGG));
    assert_eq!(ContentType::from_extension("ogv"), Some(ContentType::OGG));
    assert_eq!(ContentType::from_extension("pdf"), Some(ContentType::PDF));
    assert_eq!(ContentType::from_extension("ttf"), Some(ContentType::TTF));
    assert_eq!(ContentType::from_extension("otf"), Some(ContentType::OTF));
    assert_eq!(ContentType::from_extension("woff"), Some(ContentType::WOFF));
    assert_eq!(ContentType::from_extension("woff2"), Some(ContentType::WOFF2));
    assert_eq!(ContentType::from_extension("mp4"), Some(ContentType::MP4));
    assert_eq!(ContentType::from_extension("mpeg4"), Some(ContentType::MP4));
    assert_eq!(ContentType::from_extension("wasm"), Some(ContentType::WASM));
    assert_eq!(ContentType::from_extension("aac"), Some(ContentType::AAC));
    assert_eq!(ContentType::from_extension("ics"), Some(ContentType::Calendar));
    assert_eq!(ContentType::from_extension("bin"), Some(ContentType::Binary));
    assert_eq!(ContentType::from_extension("mpg"), Some(ContentType::MPEG));
    assert_eq!(ContentType::from_extension("mpeg"), Some(ContentType::MPEG));
    assert_eq!(ContentType::from_extension("tar"), Some(ContentType::TAR));
    assert_eq!(ContentType::from_extension("gz"), Some(ContentType::GZIP));
    assert_eq!(ContentType::from_extension("tif"), Some(ContentType::TIFF));
    assert_eq!(ContentType::from_extension("tiff"), Some(ContentType::TIFF));
    assert_eq!(ContentType::from_extension("mov"), Some(ContentType::MOV));
    assert_eq!(ContentType::from_extension("zip"), Some(ContentType::ZIP));
}

上記はテストって意味ではなくこういう法則でこのようにContentTypeの判定ができましたっていう意味のコードです。ContentType目的でテストを書くならContentType::Hogeの文字列なりを取り出して比較しておくと良いかなと。

[src/main.rs:4] ContentType::from_extension("html") = Some(
    ContentType(
        MediaType {
            source: Known(
                "text/html; charset=utf-8",
            ),
            top: "text",
            sub: "html",
            params: Static(
                [
                    (
                        "charset",
                        "utf-8",
                    ),
                ],
            ),
        },
    ),
)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA