http_type/content_type/impl.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
use super::r#type::ContentType;
use http_constant::{APPLICATION_JSON, APPLICATION_XML, FORM_URLENCODED, TEXT_HTML, TEXT_PLAIN};
use serde::Serialize;
use serde_json;
use serde_xml_rs;
use std::{
fmt::{Debug, Display},
str::FromStr,
};
impl ContentType {
/// Handles the `application/json` Content-Type by serializing the provided data
/// into a JSON string.
///
/// # Type Parameters
/// - `T`: The type of the data to be serialized, which must implement `Serialize`.
///
/// # Parameters
/// - `data`: The data to be serialized into JSON.
///
/// # Returns
/// A string containing the serialized JSON representation of the provided data.
/// If serialization fails, it returns an empty JSON object (`{}`).
fn get_application_json<T: Serialize + Display>(data: &T) -> String {
serde_json::to_string(data).unwrap_or_else(|_| String::from("{}"))
}
/// Handles the `application/xml` Content-Type by serializing the provided data
/// into an XML string.
///
/// # Type Parameters
/// - `T`: The type of the data to be serialized, which must implement `Serialize`.
///
/// # Parameters
/// - `data`: The data to be serialized into XML.
///
/// # Returns
/// A string containing the serialized XML representation of the provided data.
/// If serialization fails, it returns an empty XML root element (`<root></root>`).
fn get_application_xml<T: Serialize + Display>(data: &T) -> String {
serde_xml_rs::to_string(data).unwrap_or_else(|_| String::from("<root></root>"))
}
/// Handles the `text/plain` Content-Type by formatting the provided data
/// into a plain text string.
///
/// # Type Parameters
/// - `T`: The type of the data to be formatted, which must implement `Serialize`, `Debug`, `Clone`, and `Default`.
///
/// # Parameters
/// - `data`: The data to be formatted into plain text.
///
/// # Returns
/// A plain text string representing the provided data, formatted with the `Debug` trait.
fn get_text_plain<T: Serialize + Debug + Clone + Default + Display>(data: &T) -> String {
data.to_string()
}
/// Handles the `text/html` Content-Type by formatting the provided data
/// into an HTML string, typically inside a simple table.
///
/// # Type Parameters
/// - `T`: The type of the data to be formatted, which must implement `Serialize`, `Debug`, `Clone`, and `Default`.
///
/// # Parameters
/// - `data`: The data to be formatted into HTML.
///
/// # Returns
/// A string containing the HTML representation of the provided data, inside a table row.
fn get_text_html<T: Serialize + Debug + Clone + Default>(data: &T) -> String {
let mut html: String = String::from("<table>");
html.push_str(&format!("<tr><td>{:?}</td></tr>", data));
html.push_str("</table>");
html
}
/// Handles the `application/x-www-form-urlencoded` Content-Type by serializing
/// the provided data into a URL-encoded string.
///
/// # Type Parameters
/// - `T`: The type of the data to be serialized, which must implement `Serialize`.
///
/// # Parameters
/// - `data`: The data to be serialized into URL-encoded format.
///
/// # Returns
/// A string containing the URL-encoded representation of the provided data.
/// If serialization fails, it returns an empty string.
fn get_form_url_encoded<T: Serialize + Display>(data: &T) -> String {
serde_urlencoded::to_string(data).unwrap_or_else(|_| String::from(""))
}
/// Handles binary data when the `Content-Type` is unknown by formatting the
/// provided data as a hexadecimal string.
///
/// # Type Parameters
/// - `T`: The type of the data to be formatted, which must implement `Serialize`, `Debug`, `Clone`, and `Default`.
///
/// # Parameters
/// - `data`: The data to be formatted into binary representation.
///
/// # Returns
/// A string containing the hexadecimal encoding of the provided data.
fn get_binary<T: Serialize + Debug + Clone + Default + Display>(data: &T) -> String {
hex::encode(data.to_string())
}
/// Public interface for getting a formatted body string based on the `ContentType`.
///
/// This method routes the data to the appropriate handler method based on the
/// `ContentType`, formatting the body accordingly.
///
/// # Type Parameters
/// - `T`: The type of the data to be formatted, which must implement `Serialize`, `Debug`, `Clone`, and `Default`.
///
/// # Parameters
/// - `data`: The data to be formatted into the body string.
///
/// # Returns
/// A string containing the formatted body based on the content type, such as JSON, XML, plain text, HTML, etc.
pub fn get_body_string<T: Serialize + Debug + Clone + Default + Display>(
&self,
data: &T,
) -> String {
match self {
Self::ApplicationJson => Self::get_application_json(data),
Self::ApplicationXml => Self::get_application_xml(data),
Self::TextPlain => Self::get_text_plain(data),
Self::TextHtml => Self::get_text_html(data),
Self::FormUrlEncoded => Self::get_form_url_encoded(data),
Self::Unknown => Self::get_binary(data),
}
}
}
impl FromStr for ContentType {
type Err = ();
fn from_str(data: &str) -> Result<Self, Self::Err> {
match data.to_lowercase().as_str() {
_data if _data == APPLICATION_JSON => Ok(Self::ApplicationJson),
_data if _data == APPLICATION_XML => Ok(Self::ApplicationXml),
_data if _data == TEXT_PLAIN => Ok(Self::TextPlain),
_data if _data == TEXT_HTML => Ok(Self::TextHtml),
_data if _data == FORM_URLENCODED => Ok(Self::FormUrlEncoded),
_ => Ok(Self::Unknown),
}
}
}
impl Default for ContentType {
fn default() -> Self {
Self::Unknown
}
}