1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use super::{run, AlternateScreenPagingError, PagerMutex};

/// Run the pager inside a [`tokio task`](tokio::task).
///
/// This function is only available when `tokio_lib` feature is enabled.
/// It takes a [`PagerMutex`] and updates the page with new information when `PagerMutex`
/// is updated.
///
/// This function switches to the [`Alternate Screen`] of the TTY and switches
/// to [`raw mode`].
///
/// [`Alternate Screen`]: crossterm::terminal#alternate-screen
/// [`raw mode`]: crossterm::terminal#raw-mode
///
/// ## Errors
///
/// Several operations can fail when outputting information to a terminal, see
/// the [`Result`] type.
///
/// ## Example
///
/// ```rust,no_run
/// use futures::join;
/// use tokio::time::sleep;

/// use std::fmt::Write;
/// use std::time::Duration;

/// #[tokio::main]
/// async fn main() -> Result<(), Box<dyn std::error::Error>> {
///    let output = minus::Pager::new().unwrap().finish();
///
///    let increment = async {
///         for i in 0..=30_u32 {
///             let mut output = output.lock().await;
///             output.push_str(&format!("{}", i));
///             drop(output);
///             sleep(Duration::from_millis(100)).await;
///          }
///          Result::<_, std::fmt::Error>::Ok(())
///      };
///
///    let (res1, res2) = join!(minus::tokio_updating(output.clone()), increment);
///    res1?;
///    res2?;
///    Ok(())
/// }
/// ```
///
/// **Please do note that you should never lock the output data, since this
/// will cause the paging thread to be paused. Only borrow it when it is
/// required and drop it if you have further asynchronous blocking code.**
#[cfg(feature = "tokio_lib")]
#[cfg_attr(docsrs, doc(cfg(feature = "tokio_lib")))]
pub async fn tokio_updating(pager: PagerMutex) -> Result<(), AlternateScreenPagingError> {
    tokio::task::spawn(run(pager)).await?
}