network/manager/
context.rs

1use core::task::{Context, Poll};
2
3use crate::manager::stack::Stack;
4use smoltcp::iface::SocketHandle;
5
6pub struct SocketContext {
7    pub handle: SocketHandle,
8    pub stack: Stack,
9    pub closed: bool,
10}
11
12impl SocketContext {
13    pub async fn with<F, S, R>(&self, f: F) -> R
14    where
15        F: FnOnce(&S) -> R,
16        S: smoltcp::socket::AnySocket<'static>,
17    {
18        self.stack
19            .with(|stack_inner| {
20                let socket = stack_inner.sockets.get::<S>(self.handle);
21                f(socket)
22            })
23            .await
24    }
25
26    pub async fn with_mutable<F, S, R>(&self, f: F) -> R
27    where
28        F: FnOnce(&mut S) -> R,
29        S: smoltcp::socket::AnySocket<'static>,
30    {
31        self.stack
32            .with_mutable(|stack_inner| {
33                let socket = stack_inner.sockets.get_mut::<S>(self.handle);
34                f(socket)
35            })
36            .await
37    }
38
39    pub fn poll_with<F, S, R>(&self, context: &mut Context<'_>, f: F) -> Poll<R>
40    where
41        F: FnOnce(&S, &mut Context<'_>) -> Poll<R>,
42        S: smoltcp::socket::AnySocket<'static>,
43    {
44        self.stack.poll_with(context, |stack_inner, context| {
45            let socket = stack_inner.sockets.get::<S>(self.handle);
46
47            f(socket, context)
48        })
49    }
50
51    pub fn poll_with_mutable<F, S, R>(&self, context: &mut core::task::Context<'_>, f: F) -> Poll<R>
52    where
53        F: FnOnce(&mut S, &mut Context<'_>) -> Poll<R>,
54        S: smoltcp::socket::AnySocket<'static>,
55    {
56        self.stack
57            .poll_with_mutable(context, |stack_inner, context| {
58                let socket = stack_inner.sockets.get_mut::<S>(self.handle);
59
60                f(socket, context)
61            })
62    }
63}