1use std::task::Poll;
4use tokio_test::task;
5use tower_service::Service;
6
7#[derive(Debug)]
9pub struct Spawn<T> {
10 inner: T,
11 task: task::Spawn<()>,
12}
13
14impl<T> Spawn<T> {
15 pub fn new(inner: T) -> Self {
17 Self {
18 inner,
19 task: task::spawn(()),
20 }
21 }
22
23 pub fn is_woken(&self) -> bool {
25 self.task.is_woken()
26 }
27
28 pub fn waker_ref_count(&self) -> usize {
30 self.task.waker_ref_count()
31 }
32
33 pub fn poll_ready<Request>(&mut self) -> Poll<Result<(), T::Error>>
35 where
36 T: Service<Request>,
37 {
38 let task = &mut self.task;
39 let inner = &mut self.inner;
40
41 task.enter(|cx, _| inner.poll_ready(cx))
42 }
43
44 pub fn call<Request>(&mut self, req: Request) -> T::Future
46 where
47 T: Service<Request>,
48 {
49 self.inner.call(req)
50 }
51
52 pub fn into_inner(self) -> T {
54 self.inner
55 }
56
57 pub fn get_ref(&self) -> &T {
59 &self.inner
60 }
61
62 pub fn get_mut(&mut self) -> &mut T {
64 &mut self.inner
65 }
66}
67
68impl<T: Clone> Clone for Spawn<T> {
69 fn clone(&self) -> Self {
70 Spawn::new(self.inner.clone())
71 }
72}