1use futures_task::{FutureObj, Spawn, SpawnError};
2
3/// An implementation of [`Spawn`](futures_task::Spawn) that panics
4/// when used.
5///
6/// # Examples
7///
8/// ```should_panic
9/// use futures::task::SpawnExt;
10/// use futures_test::task::PanicSpawner;
11///
12/// let spawn = PanicSpawner::new();
13/// spawn.spawn(async { })?; // Will panic
14/// # Ok::<(), Box<dyn std::error::Error>>(())
15/// ```
16#[derive(Debug)]
17pub struct PanicSpawner {
18 _reserved: (),
19}
20
21impl PanicSpawner {
22 /// Create a new instance
23 pub fn new() -> Self {
24 Self { _reserved: () }
25 }
26}
27
28impl Spawn for PanicSpawner {
29 fn spawn_obj(&self, _future: FutureObj<'static, ()>) -> Result<(), SpawnError> {
30 panic!("should not spawn")
31 }
32}
33
34impl Default for PanicSpawner {
35 fn default() -> Self {
36 Self::new()
37 }
38}
39
40/// Get a reference to a singleton instance of [`PanicSpawner`].
41///
42/// # Examples
43///
44/// ```should_panic
45/// use futures::task::SpawnExt;
46/// use futures_test::task::panic_spawner_mut;
47///
48/// let spawner = panic_spawner_mut();
49/// spawner.spawn(async { })?; // Will panic
50/// # Ok::<(), Box<dyn std::error::Error>>(())
51/// ```
52pub fn panic_spawner_mut() -> &'static mut PanicSpawner {
53 Box::leak(Box::new(PanicSpawner::new()))
54}
55