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}