sa_token_plugin_tide/
adapter.rs1use tide::{Request, Response, StatusCode};
7use sa_token_adapter::{SaRequest, SaResponse, CookieOptions, build_cookie_string};
8use serde::Serialize;
9
10pub struct TideRequestAdapter<'a, State> {
13 request: &'a Request<State>,
14}
15
16impl<'a, State> TideRequestAdapter<'a, State> {
17 pub fn new(request: &'a Request<State>) -> Self {
20 Self { request }
21 }
22}
23
24impl<'a, State> SaRequest for TideRequestAdapter<'a, State> {
25 fn get_header(&self, name: &str) -> Option<String> {
26 self.request
27 .header(name)
28 .and_then(|v| v.as_str().parse().ok())
29 }
30
31 fn get_cookie(&self, name: &str) -> Option<String> {
32 if let Some(cookie) = self.request.cookie(name) {
34 return Some(cookie.value().to_string());
35 }
36
37 if let Some(cookie_header) = self.request.header("cookie") {
39 if let Some(cookie_str) = cookie_header.get(0) {
40 let cookies = sa_token_adapter::utils::parse_cookies(cookie_str.as_str());
41 if let Some(value) = cookies.get(name) {
42 return Some(value.to_string());
43 }
44 }
45 }
46
47 None
48 }
49
50 fn get_param(&self, name: &str) -> Option<String> {
51 if let Some((_, value)) = self.request.url().query_pairs()
53 .find(|(k, _)| k == name) {
54 return Some(value.to_string());
55 }
56
57 if let Some(query) = self.request.url().query() {
59 let params = sa_token_adapter::utils::parse_query_string(query);
60 if let Some(value) = params.get(name) {
61 return Some(value.to_string());
62 }
63 }
64
65 None
66 }
67
68 fn get_path(&self) -> String {
69 self.request.url().path().to_string()
70 }
71
72 fn get_method(&self) -> String {
73 self.request.method().to_string()
74 }
75}
76
77pub struct TideResponseAdapter {
80 response: Response,
81}
82
83impl TideResponseAdapter {
84 pub fn new(response: Response) -> Self {
87 Self { response }
88 }
89
90 pub fn into_response(self) -> Response {
93 self.response
94 }
95}
96
97impl SaResponse for TideResponseAdapter {
98 fn set_header(&mut self, name: &str, value: &str) {
99 self.response.insert_header(name, value);
100 }
101
102 fn set_cookie(&mut self, name: &str, value: &str, options: CookieOptions) {
103 let cookie_string = build_cookie_string(name, value, options);
104 self.set_header("Set-Cookie", &cookie_string);
105 }
106
107 fn set_status(&mut self, status: u16) {
108 let status_code = StatusCode::try_from(status).unwrap_or(StatusCode::Ok);
110 self.response.set_status(status_code);
111 }
112
113 fn set_json_body<U: Serialize>(&mut self, body: U) -> Result<(), serde_json::Error> {
114 match serde_json::to_string(&body) {
115 Ok(json) => {
116 self.response.set_body(json);
117 self.response.set_content_type("application/json");
118 Ok(())
119 }
120 Err(e) => Err(e),
121 }
122 }
123}
124