Skip to main content

memcached_async/
context.rs

1use std::any::{Any, TypeId};
2use std::collections::HashMap;
3use std::net::SocketAddr;
4use std::sync::Arc;
5
6use crate::types::{Request, RequestMeta};
7
8/// Per-request context passed to handlers.
9#[derive(Debug, Clone)]
10pub struct RequestContext {
11    pub request: Request,
12    pub meta: RequestMeta,
13    pub peer_addr: SocketAddr,
14    pub local_addr: SocketAddr,
15    pub client_id: u64,
16    pub extensions: Extensions,
17}
18
19/// Connection-level info for extension factories.
20#[derive(Debug, Clone, Copy)]
21pub struct ConnectionInfo {
22    pub peer_addr: SocketAddr,
23    pub local_addr: SocketAddr,
24    pub client_id: u64,
25}
26
27/// Typed extensions map stored in the request context.
28#[derive(Debug, Default, Clone)]
29pub struct Extensions {
30    inner: HashMap<TypeId, Arc<dyn Any + Send + Sync>>,
31}
32
33impl Extensions {
34    pub fn insert<T: Send + Sync + 'static>(&mut self, value: T) {
35        self.inner.insert(TypeId::of::<T>(), Arc::new(value));
36    }
37
38    pub fn get<T: Send + Sync + 'static>(&self) -> Option<&T> {
39        self.inner
40            .get(&TypeId::of::<T>())
41            .and_then(|value| value.as_ref().downcast_ref::<T>())
42    }
43
44    /// Returns a mutable reference when this entry is uniquely owned.
45    pub fn get_mut<T: Send + Sync + 'static>(&mut self) -> Option<&mut T> {
46        self.inner
47            .get_mut(&TypeId::of::<T>())
48            .and_then(|value| Arc::get_mut(value))
49            .and_then(|value| value.downcast_mut::<T>())
50    }
51}
52
53/// Client id wrapper.
54#[derive(Debug, Clone, Copy, Eq, PartialEq)]
55pub struct ClientId(pub u64);
56
57/// Peer address wrapper.
58#[derive(Debug, Clone, Copy, Eq, PartialEq)]
59pub struct PeerAddr(pub SocketAddr);
60
61/// Local address wrapper.
62#[derive(Debug, Clone, Copy, Eq, PartialEq)]
63pub struct LocalAddr(pub SocketAddr);
64
65/// Application state wrapper for extractors.
66#[derive(Debug, Clone)]
67pub struct State<T>(pub Arc<T>);