pub mod header {
pub struct Header {
key: &'static str,
value: &'static str,
}
impl Header {
pub fn to_string(&self) -> String {
format!("{}: {}", &self.key, &self.value)
}
pub fn new(key: &'static str, value: &'static str) -> Header {
Header {
key: key.trim(),
value: value.trim(),
}
}
}
pub struct Headers {
headers: Vec<Header>,
}
impl Headers {
pub fn new() -> Headers {
Headers { headers: vec![] }
}
pub fn append(&mut self, header: Header) {
self.headers.push(header);
}
pub fn has(&self, key: &'static str) -> bool {
for header in &self.headers {
if key.trim().to_lowercase().eq(&header.key.to_lowercase()) {
return true;
}
}
false
}
pub fn get(&self, key: &'static str) -> Option<&Header> {
for header in &self.headers {
if key.trim().to_lowercase().eq(&header.key.to_lowercase()) {
return Some(header);
}
}
None
}
pub fn finalize(&self) -> String {
let mut final_string = String::new();
for header in &self.headers {
final_string += &header.to_string();
final_string += "\r\n\r\n";
}
final_string
}
}
}
#[cfg(test)]
mod tests {
#[test]
fn to_string() {
use super::header::Header;
let header = Header::new("Content-Type", "application/json");
assert_eq!(header.to_string(), String::from("Content-Type: application/json"));
}
#[test]
fn has() {
use super::header::Header;
use super::header::Headers;
let mut headers = Headers::new();
headers.append(Header::new("Content-Type", "Application/Json"));
headers.append(Header::new("Content-Type", "Application/Json"));
assert_eq!(true, headers.has("content-type"));
}
}