hitt_formatter/
lib.rs

1use json::format_json;
2
3mod json;
4
5#[derive(Copy, Clone, Default, PartialEq, Eq)]
6pub enum ContentType {
7    Json,
8    #[default]
9    Unknown,
10}
11
12impl From<&str> for ContentType {
13    #[inline]
14    fn from(value: &str) -> Self {
15        value
16            .parse::<mime::Mime>()
17            .map_or(Self::Unknown, |m| match (m.type_(), m.subtype()) {
18                (_, mime::JSON) => Self::Json,
19                _ => Self::Unknown,
20            })
21    }
22}
23
24#[cfg(test)]
25mod test_from_str_to_content_type {
26    use crate::ContentType;
27
28    #[test]
29    fn it_should_parse_unknown_text_as_unknown() {
30        for x in u8::MIN..u8::MAX {
31            assert!(ContentType::Unknown == ContentType::from(x.to_string().as_str()));
32            assert!(
33                ContentType::Unknown == ContentType::from(format!("application/masd-{x}").as_str())
34            );
35            assert!(ContentType::Unknown == ContentType::from(format!("text/masd-{x}").as_str()));
36        }
37    }
38
39    #[test]
40    fn it_should_parse_application_json_as_json() {
41        let input = "application/JSON";
42
43        assert!(ContentType::Json == ContentType::from(input));
44        assert!(ContentType::Json == ContentType::from(input.to_lowercase().as_str()));
45        assert!(ContentType::Json == ContentType::from(input.to_uppercase().as_str()));
46
47        assert!(ContentType::Json == ContentType::from("application/json; charset=utf-8"));
48    }
49}
50
51#[inline]
52pub fn format(input: &str, content_type: ContentType) -> Option<String> {
53    match content_type {
54        ContentType::Json => Some(format_json(input)),
55        ContentType::Unknown => None,
56    }
57}
58
59#[cfg(test)]
60mod test_format {
61    use crate::ContentType;
62
63    #[test]
64    fn it_should_ignore_unknown_content_types() {
65        let input = "this is an unknown content type";
66
67        assert!(crate::format(input, ContentType::Unknown).is_none());
68    }
69
70    #[test]
71    fn it_should_format_json() {
72        let input = "{ \"key\": \"value\" }";
73        let content_type = ContentType::Json;
74
75        assert_eq!(
76            crate::format(input, content_type),
77            Some(crate::json::format_json(input))
78        );
79    }
80}