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
use serde_json::{Value, to_string};

pub struct Response {
    status: u32,
    status_message: String,
    json: String
} 

impl Response {
    pub fn new() -> Self {
        Response {
            status: 404,
            status_message: String::from("Not Found"),
            json: String::from("")
        }
    }

    pub fn status(&mut self, status: u32){
        let (status_message, status) = match status {
            200 => ("Ok", status),
            201 => ("Created", status),
            204 => ("No Content", status),
            304 => ("Not Modified", status),
            400 => ("Bad Request", status),
            401 => ("Unauthorized", status),
            403 => ("Forbidden", status),
            404 => ("Not Found", status),
            409 => ("Conflict", status),
            500 => ("Interval Server Error", status),
            _ => ("Not Found", 404),
        };
        
        self.status_message = String::from(status_message);
        self.status = status;
    }

    pub fn get_status(&self) -> u32 {
        return self.status;
    }

    pub fn get_status_message(&self) -> &String {
        return &self.status_message;
    }

    pub fn send(&mut self, value: &str){
        self.status(200);
        self.json = String::from(value);
    }

    pub fn json(&mut self, value: &Value){
        self.status(200);
        if let Ok(response_message) = to_string(value) {
            self.json = response_message;
        }
    }

    pub fn get_json(&self) -> &String {
        return &self.json;
    }

    pub fn get_http_response(&self) -> String {
        let status = self.get_status();
        let status_message = self.get_status_message();
        let status_line = &format!("HTTP/1.1 {}\r\n", status);

        let message_body = self.get_json();
        let content_length = &format!("content-length: {}\r\n", message_body.len());
        let content_type = &format!("content-type: {}\r\n", "application/json; charset=utf-8");
        let connection = &format!("connection: {}\r\n", "keep-alive");
        let access_control = &format!("access-control-allow-origin: {}\r\n\r\n", "*");
        
        let response = format!("{}{}{}{}{}{}", 
            status_line,
            content_length,
            content_type,
            connection,
            access_control,
            message_body
        );

        return response;
    }
}