1use crate::*;
2
3impl InnerContext {
4 pub fn new() -> Self {
5 InnerContext {
6 socket: None,
7 request: Request::new(),
8 response: Response::default(),
9 log: Log::default(),
10 socket_addr: None,
11 data: HashMap::default(),
12 }
13 }
14}
15
16impl Context {
17 pub(crate) fn from_inner_context(ctx: InnerContext) -> Self {
18 Self(Arc::new(RwLock::new(ctx)))
19 }
20
21 pub async fn get_read_lock(&self) -> RwLockReadContext {
22 self.0.read().await
23 }
24
25 pub async fn get_write_lock(&self) -> RwLockWriteContext {
26 self.0.write().await
27 }
28
29 pub async fn get(&self) -> InnerContext {
30 self.get_read_lock().await.clone()
31 }
32
33 pub async fn get_request(&self) -> Request {
34 self.get().await.get_request().clone()
35 }
36
37 pub async fn get_response(&self) -> Response {
38 self.get().await.get_response().clone()
39 }
40
41 pub async fn get_log(&self) -> Log {
42 self.get().await.get_log().clone()
43 }
44
45 pub async fn get_socket(&self) -> OptionArcRwLockUdpSocket {
46 self.get().await.get_socket().clone()
47 }
48
49 pub async fn get_socket_addr(&self) -> OptionSocketAddr {
50 self.get().await.get_socket_addr().clone()
51 }
52
53 pub async fn get_socket_addr_or_default(&self) -> SocketAddr {
54 let socket_result: OptionArcRwLockUdpSocket = self.get_socket().await;
55 if socket_result.is_none() {
56 return DEFAULT_SOCKET_ADDR;
57 }
58 let socket_addr: SocketAddr = socket_result
59 .unwrap()
60 .get_read_lock()
61 .await
62 .peer_addr()
63 .unwrap_or(DEFAULT_SOCKET_ADDR);
64 socket_addr
65 }
66
67 pub async fn get_socket_addr_string(&self) -> Option<String> {
68 self.get_socket_addr().await.map(|data| data.to_string())
69 }
70
71 pub async fn get_socket_addr_or_default_string(&self) -> String {
72 self.get_socket_addr_or_default().await.to_string()
73 }
74
75 pub async fn get_socket_host(&self) -> OptionSocketHost {
76 self.get_socket_addr()
77 .await
78 .map(|socket_addr: SocketAddr| socket_addr.ip())
79 }
80
81 pub async fn get_socket_port(&self) -> OptionSocketPort {
82 self.get_socket_addr()
83 .await
84 .map(|socket_addr: SocketAddr| socket_addr.port())
85 }
86
87 pub(super) async fn set_response<T: Into<ResponseData>>(&self, data: T) -> &Self {
88 self.get_write_lock()
89 .await
90 .set_response(Response::from(data));
91 self
92 }
93
94 pub async fn log_info<T, L>(&self, data: T, func: L) -> &Self
95 where
96 T: ToString,
97 L: LogFuncTrait<T>,
98 {
99 self.get_read_lock().await.get_log().info(data, func);
100 self
101 }
102
103 pub async fn log_debug<T, L>(&self, data: T, func: L) -> &Self
104 where
105 T: ToString,
106 L: LogFuncTrait<T>,
107 {
108 self.get_read_lock().await.get_log().debug(data, func);
109 self
110 }
111
112 pub async fn log_error<T, L>(&self, data: T, func: L) -> &Self
113 where
114 T: ToString,
115 L: LogFuncTrait<T>,
116 {
117 self.get_read_lock().await.get_log().error(data, func);
118 self
119 }
120
121 pub async fn async_log_info<T, L>(&self, data: T, func: L) -> &Self
122 where
123 T: ToString,
124 L: LogFuncTrait<T>,
125 {
126 self.get_read_lock()
127 .await
128 .get_log()
129 .async_info(data, func)
130 .await;
131 self
132 }
133
134 pub async fn async_log_debug<T, L>(&self, data: T, func: L) -> &Self
135 where
136 T: ToString,
137 L: LogFuncTrait<T>,
138 {
139 self.get_read_lock()
140 .await
141 .get_log()
142 .async_debug(data, func)
143 .await;
144 self
145 }
146
147 pub async fn async_log_error<T, L>(&self, data: T, func: L) -> &Self
148 where
149 T: ToString,
150 L: LogFuncTrait<T>,
151 {
152 self.get_read_lock()
153 .await
154 .get_log()
155 .async_error(data, func)
156 .await;
157 self
158 }
159
160 pub async fn send<T: Into<ResponseData>>(&self, data: T) -> ResponseResult {
161 let response_result: ResponseResult = self
162 .set_response(data)
163 .await
164 .get_response()
165 .await
166 .send(&self.get_socket().await, &self.get_socket_addr().await)
167 .await;
168 return response_result;
169 }
170
171 pub async fn set_data_value<T: Any + Send + Sync + Clone>(
172 &self,
173 key: &str,
174 value: &T,
175 ) -> &Self {
176 self.get_write_lock()
177 .await
178 .get_mut_data()
179 .insert(key.to_owned(), Arc::new(value.clone()));
180 self
181 }
182
183 pub async fn get_data_value<T: Any + Send + Sync + Clone>(&self, key: &str) -> Option<T> {
184 self.get_read_lock()
185 .await
186 .get_data()
187 .get(key)
188 .and_then(|arc| arc.downcast_ref::<T>())
189 .cloned()
190 }
191
192 pub async fn remove_data_value(&self, key: &str) -> &Self {
193 self.get_write_lock().await.get_mut_data().remove(key);
194 self
195 }
196
197 pub async fn clear_data(&self) -> &Self {
198 self.get_write_lock().await.get_mut_data().clear();
199 self
200 }
201}