network/manager/
context.rs1use 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}