kodumaro-http-cli 0.5.5

Kodumaro HTTP CLI inspired by HTTPie
Documentation
use std::io::Write;

use eyre::Result;
use syntect::{
    easy::HighlightLines,
    highlighting::{Style, ThemeSet},
    parsing::SyntaxSet,
    util::{as_24_bit_terminal_escaped, LinesWithEndings},
};

pub(crate) fn format_by_ext(body: &str, filename: &str, writer: &mut impl Write) -> Result<()> {
    let ext = filename.split('.').last().unwrap_or("txt");
    let ps = SyntaxSet::load_defaults_newlines();
    let ts = ThemeSet::load_defaults();
    match ps.find_syntax_by_extension(ext) {
        Some(syntax) => {
            let mut h = HighlightLines::new(syntax, &ts.themes["Solarized (dark)"]);
            for line in LinesWithEndings::from(body) {
                let ranges: Vec<(Style, &str)> =
                    h.highlight_line(line, &ps).unwrap();
                let escaped = as_24_bit_terminal_escaped(&ranges[..], false);
                write!(writer, "{}", escaped)?;
            }
        }

        None => {
            write!(writer, "{}", body)?;
            write!(writer, "\n")?;
        }
    }

    Ok(())
}

pub(crate) fn add_ext(filename: &str, content_type: &str) -> String {
    if content_type.contains("markdown") {
        format!("{}.md", filename)
    } else if content_type.contains("html") {
        format!("{}.html", filename)
    } else if content_type.contains("json") {
        format!("{}.json", filename)
    } else if content_type.contains("toml") {
        format!("{}.toml", filename)
    } else if content_type.contains("xml") {
        format!("{}.xml", filename)
    } else if content_type.contains("yaml") {
        format!("{}.yaml", filename)
    } else if content_type.contains("plain") {
        format!("{}.txt", filename)
    } else {
        filename.to_string()
    }
}

#[cfg(test)]
mod tests {

    use super::*;

    #[test]
    fn test_add_ext_md() {
        let name = add_ext("test", "text/markdown");
        assert_eq!("test.md", name);
    }

    #[test]
    fn test_add_ext_html() {
        let name = add_ext("test", "text/html");
        assert_eq!("test.html", name);
    }

    #[test]
    fn test_add_ext_json() {
        let name = add_ext("test", "application/json");
        assert_eq!("test.json", name);
    }

    #[test]
    fn test_add_ext_toml() {
        let name = add_ext("test", "application/toml");
        assert_eq!("test.toml", name);
    }

    #[test]
    fn test_add_ext_xml() {
        let name = add_ext("test", "application/xml");
        assert_eq!("test.xml", name);
    }

    #[test]
    fn test_add_ext_yaml() {
        let name = add_ext("test", "application/yaml");
        assert_eq!("test.yaml", name);
    }

    #[test]
    fn test_add_ext_txt() {
        let name = add_ext("test", "text/plain");
        assert_eq!("test.txt", name);
    }

    #[test]
    fn test_add_ext_unknown() {
        let name = add_ext("test", "application/octet-stream");
        assert_eq!("test", name);
    }
}