1
2use uuid::Uuid;
3
4use crate::request::Request;
5use crate::response::Response;
6use crate::session::SessionManager;
7
8use std::rc::Rc;
9use std::sync::Arc;
10use std::cell::{Ref, RefMut, RefCell};
11use std::marker::PhantomData;
12
13pub struct Context<'ptr,'req> {
16 request: Rc<RefCell<Request<'req>>>,
17 response: Rc<RefCell<Response<'req>>>,
18 pub session_id: Uuid,
19 session_manager: Arc<SessionManager>,
20 phantom: PhantomData<&'ptr ()>,
21}
22
23#[allow(dead_code)]
24impl<'ptr, 'req> Context<'ptr, 'req> {
25 pub fn new(request: Rc<RefCell<Request<'req>>>,
26 response: Rc<RefCell<Response<'req>>>,
27 session_id: Uuid,
28 session_manager: Arc<SessionManager>) -> Self {
29 Self {
30 request,
31 response,
32 session_id,
33 session_manager,
34 phantom: PhantomData,
35 }
36 }
37
38 pub fn request(&self) -> Ref<Request<'req>> {
40 self.request.borrow()
41 }
42
43 pub fn request_mut(&mut self) -> RefMut<Request<'req>> {
47 self.request.borrow_mut()
48 }
49
50 pub fn response(&self) -> Ref<Response<'req>> {
52 self.response.borrow()
53 }
54
55 pub fn response_mut(&mut self) -> RefMut<Response<'req>> {
57 self.response.borrow_mut()
58 }
59
60 pub fn write_session(&self, session_id: Uuid, key: &str, value: &str) -> bool {
64 if session_id.is_nil() {
65 return false;
66 }
67 self.session_manager.write_session(session_id, key, value)
68 }
69
70 pub fn read_session(&self, session_id: Uuid, key: &str) -> Option<String> {
73 if session_id.is_nil() {
74 return None;
75 }
76 self.session_manager.read_session(session_id, key)
77 }
78
79 pub fn clear_session(&self, session_id: Uuid) {
82 if session_id.is_nil() {
83 return;
84 }
85 self.session_manager.clear_session(session_id);
86 }
87
88 pub fn delete_session(&self, session_id: Uuid) {
91 if session_id.is_nil() {
92 return;
93 }
94 self.session_manager.delete_session(session_id);
95 }
96
97 pub fn new_session(&self) -> Uuid {
100 self.session_manager.create_session()
101 }
102
103 pub fn session_exists(&self, session_id: Uuid) -> bool {
105 if session_id.is_nil() {
106 return false;
107 }
108 self.session_manager.session_exists(session_id)
109 }
110
111 pub fn redirect(&mut self, location: &str) {
113 self.response.borrow_mut().code = "302";
114 self.response.borrow_mut().headers.insert("Location", location.to_string());
115 }
116}
117