gato_core/kernel/
request.rs

1use std::collections::HashMap;
2use serde_json::Value;
3
4pub struct RequestBuilder {
5    request: Request
6}
7
8impl RequestBuilder {
9
10    pub fn new() -> Self {
11        return RequestBuilder {
12            request: Request::new()
13        };
14    }
15
16    pub fn add_method(&mut self, method: String) {
17        self.request.method = method;
18    }
19
20    pub fn add_uri(&mut self, uri: String) {
21        self.request.uri = uri;
22    }
23
24    pub fn add_param(&mut self, name: String, value: String) {
25        self.request.params.insert(name, value);
26    }
27
28    pub fn add_params(&mut self, params: HashMap<String, String>) {
29        self.request.params = params;
30    }
31    
32    pub fn add_querystring(&mut self, querystring: HashMap<String, String>) {
33        self.request.querystring = querystring;
34    }
35
36    pub fn add_header(&mut self, name: String, value: String) {
37        self.request.headers.insert(name, value);
38    }
39
40    pub fn add_headers(&mut self, headers: HashMap<String, String>) {
41        self.request.headers = headers;
42    }
43
44    pub fn add_body(&mut self, body: String) {
45        self.request.body = body;
46    }
47
48    pub fn get_request(&self) -> Request {
49        return self.request.clone();
50    }
51
52}
53
54pub struct Request {
55    method: String,
56    uri: String,
57    headers: HashMap<String, String>,
58    params: HashMap<String, String>,
59    querystring: HashMap<String, String>,
60    body: String
61}
62
63impl Request {
64
65    fn new() -> Self {
66        return Request {
67            method: String::new(),
68            uri: String::new(),
69            body: String::new(),
70            headers: HashMap::new(),
71            querystring: HashMap::new(),
72            params: HashMap::new()
73        };
74    }
75
76    fn clone(&self) -> Self {
77        return Request {
78            method: self.method.clone(),
79            uri:  self.uri.clone(),
80            body:  self.body.clone(),
81            headers:  self.headers.clone(),
82            querystring:  self.querystring.clone(),
83            params:  self.params.clone()
84        };
85    }
86
87    pub fn get_uri(&self) -> String {
88        return self.uri.clone();
89    }
90
91    pub fn get_method(&self) -> String {
92        return self.method.clone();
93    }
94
95    // TODO add multipart/form-data handler
96    pub fn get(&self, field: &str) -> Value {
97        let mut json = self.json();
98        let fields = field.split(".");
99        for field in fields {
100            json = json[field].clone();
101        }
102        return json;
103    }
104
105    pub fn json(&self) -> Value {
106        return if self.body != "" {
107            serde_json::from_str(self.body.as_str()).unwrap()
108        } else {
109            Value::Null
110        };
111    }
112
113    pub fn get_query(&self, name: &str) -> Option<String> {
114        if self.querystring.contains_key(name) {
115            return Some(self.querystring.get(&name.to_string()).unwrap().clone());
116        }
117        return None;
118    }
119    
120    pub fn get_querystring(&self) -> HashMap<String, String> {
121        return self.querystring.clone();
122    }
123
124    pub fn get_param(&self, name: &str) -> Option<String> {
125        if self.params.contains_key(name) {
126            return Some(self.params.get(&name.to_string()).unwrap().clone());
127        }
128        return None;
129    }
130
131    pub fn get_params(&self) -> HashMap<String, String> {
132        return self.params.clone();
133    }
134
135    pub fn get_headers(&self) -> HashMap<String, String> {
136        return self.headers.clone();
137    }
138
139    pub fn get_header(&self, header: String) -> String {
140        return self.headers[&header].clone();
141    }
142
143}
144
145#[macro_export]
146macro_rules! get_param {
147    ($mand_2:expr, $opt:expr) => {
148        ($mand_2.get_param($opt).unwrap_or("".to_owned()))
149    };
150    ($mand_2:expr, $($opt:expr),*) => {
151        ($(
152            $mand_2.get_param($opt).unwrap_or("".to_owned()),
153        )*)
154    };
155}
156
157#[macro_export]
158macro_rules! get_query {
159    ($mand_2:expr, $opt:expr) => {
160        ($mand_2.get_query($opt).unwrap_or("".to_owned()))
161    };
162    ($mand_2:expr, $($opt:expr),*) => {
163        ($(
164            $mand_2.get_query($opt).unwrap_or("".to_owned()),
165        )*)
166    };
167}
168
169#[macro_export]
170macro_rules! get_body {
171    ($mand_2:expr, $opt:expr) => {
172        ($mand_2.get($opt).as_str().unwrap_or("").to_string())
173    };
174    ($mand_2:expr, $($opt:expr),*) => {
175        ($(
176            $mand_2.get($opt).as_str().unwrap_or("").to_string(),
177        )*)
178    };
179}