udp/context/
impl.rs

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}