futures_test/task/
panic_spawner.rs

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