rustful 0.9.0

A light HTTP framework, with some REST-like features and the ambition of being simple, modular and non-intrusive.
use std::io::{Write, BufRead, BufReader};
use std::fs::File;
use std::collections::HashMap;
use std::borrow::Cow;
use std::env;

macro_rules! or_continue {
    ($e: expr) => (if let Some(v) = $e {
        v
    } else {
        continue;
    })
}

pub fn gen() {
    let input = File::open("build/apache/mime.types").unwrap_or_else(|e| {
        panic!("could not open 'build/apache/mime.types': {}", e);
    });

    let out_path = format!("{}/mime.rs", env::var("OUT_DIR").unwrap());
    let mut output = File::create(&out_path).unwrap_or_else(|e| {
        panic!("could not create '{}': {}", out_path, e);
    });

    let mut types = HashMap::new();

    for line in BufReader::new(input).lines().filter_map(Result::ok) {
        if let Some('#') = line.chars().next() {
            continue;
        }

        let mut parts = line.split('\t').filter(|v| v.len() > 0);
        let mut mime_type = or_continue!(parts.next()).split('/');

        let top: Cow<_> = match or_continue!(mime_type.next()) {
            "*" => "MaybeKnown::Known(::mime::TopLevel::Star)".into(),
            "text" => "MaybeKnown::Known(::mime::TopLevel::Text)".into(),
            "image" => "MaybeKnown::Known(::mime::TopLevel::Image)".into(),
            "audio" => "MaybeKnown::Known(::mime::TopLevel::Audio)".into(),
            "video" => "MaybeKnown::Known(::mime::TopLevel::Image)".into(),
            "application" => "MaybeKnown::Known(::mime::TopLevel::Application)".into(),
            "multipart" => "MaybeKnown::Known(::mime::TopLevel::Multipart)".into(),
            "message" => "MaybeKnown::Known(::mime::TopLevel::Message)".into(),
            "model" => "MaybeKnown::Known(::mime::TopLevel::Model)".into(),
            top => format!("MaybeKnown::Unknown(\"{}\")", top).into()
        };

        let sub: Cow<_> = match or_continue!(mime_type.next()) {
            "*" => "MaybeKnown::Known(::mime::SubLevel::Star)".into(),
            "plain" => "MaybeKnown::Known(::mime::SubLevel::Plain)".into(),
            "html" => "MaybeKnown::Known(::mime::SubLevel::Html)".into(),
            "xml" => "MaybeKnown::Known(::mime::SubLevel::Xml)".into(),
            "javascript" => "MaybeKnown::Known(::mime::SubLevel::Javascript)".into(),
            "css" => "MaybeKnown::Known(::mime::SubLevel::Css)".into(),
            "json" => "MaybeKnown::Known(::mime::SubLevel::Json)".into(),
            "www-form-url-encoded" => "MaybeKnown::Known(::mime::SubLevel::WwwFormUrlEncoded)".into(),
            "form-data" => "MaybeKnown::Known(::mime::SubLevel::FormData)".into(),
            "png" => "MaybeKnown::Known(::mime::SubLevel::Png)".into(),
            "gif" => "MaybeKnown::Known(::mime::SubLevel::Gif)".into(),
            "bmp" => "MaybeKnown::Known(::mime::SubLevel::Bmp)".into(),
            "jpeg" => "MaybeKnown::Known(::mime::SubLevel::Jpeg)".into(),
            sub => format!("MaybeKnown::Unknown(\"{}\")", sub).into()
        };

        for ext in or_continue!(parts.next()).split(' ') {
            types.insert(String::from(ext), format!("({}, {})", top, sub));
        }
    }

    write!(&mut output, "static MIME: ::phf::Map<&'static str, (MaybeKnown<TopLevel>, MaybeKnown<SubLevel>)> = ").unwrap();
    let mut mimes = ::phf_codegen::Map::new();
    for (ext, ty) in &types {
        mimes.entry(&ext[..], ty);
    }
    mimes.build(&mut output).unwrap();

    write!(&mut output, ";\n").unwrap();
}