Struct r3bl_terminal_async::public_api::spinner::Spinner
source · pub struct Spinner {
pub tick_delay: Duration,
pub message: String,
pub style: SpinnerStyle,
pub safe_output_terminal: SafeRawTerminal,
pub shared_writer: SharedWriter,
pub shutdown_sender: Sender<bool>,
}
Fields§
§tick_delay: Duration
§message: String
§style: SpinnerStyle
§safe_output_terminal: SafeRawTerminal
§shutdown_sender: Sender<bool>
Implementations§
source§impl Spinner
impl Spinner
sourcepub async fn try_start(
spinner_message: String,
tick_delay: Duration,
style: SpinnerStyle,
safe_output_terminal: SafeRawTerminal,
shared_writer: SharedWriter
) -> Result<Option<Spinner>>
pub async fn try_start( spinner_message: String, tick_delay: Duration, style: SpinnerStyle, safe_output_terminal: SafeRawTerminal, shared_writer: SharedWriter ) -> Result<Option<Spinner>>
Create a new instance of Spinner.
§Returns
- This will return an error if the task is already running.
- If the terminal is not fully interactive then it will return None, and won’t
start the task. This is when the terminal is not considered fully interactive:
stdout
is piped, eg:echo "foo" | cargo run --example spinner
.- or all three
stdin
,stdout
,stderr
are notis_tty
, eg when running incargo test
.
- Otherwise, it will start the task and return a Spinner instance.
More info on terminal piping:
Examples found in repository?
examples/spinner.rs (lines 65-71)
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
async fn example_with_concurrent_output(style: SpinnerStyle) -> miette::Result<()> {
let terminal_async = TerminalAsync::try_new("$ ").await?;
let terminal_async = terminal_async.expect("terminal is not fully interactive");
let address = "127.0.0.1:8000";
let message_trying_to_connect = format!(
"This is a sample indeterminate progress message: trying to connect to server on {}",
&address
);
let mut shared_writer = terminal_async.clone_shared_writer();
// Start spinner. Automatically pauses the terminal.
let mut maybe_spinner = Spinner::try_start(
message_trying_to_connect.clone(),
DELAY_UNIT,
style,
Arc::new(StdMutex::new(stderr())),
shared_writer.clone(),
)
.await?;
// Start another task, to simulate some async work, that uses a interval to display
// output, for a fixed amount of time, using `terminal_async.println_prefixed()`.
let _ = try_join!(tokio::spawn(async move {
// To calculate the delay.
let duration = ARTIFICIAL_UI_DELAY;
let start = Instant::now();
// Dropping the interval cancels it.
let mut interval = tokio::time::interval(Duration::from_millis(DELAY_MS * 5));
loop {
interval.tick().await;
let elapsed = start.elapsed();
if elapsed >= duration {
break;
}
let _ = writeln!(shared_writer, "⏳foo");
}
}));
// Stop spinner. Automatically resumes the terminal.
if let Some(spinner) = maybe_spinner.as_mut() {
spinner
.stop("This is a sample final message for the spinner component: Connected to server")
.await?;
}
tokio::time::sleep(Duration::from_millis(500)).await;
Ok(())
}
More examples
examples/terminal_async.rs (lines 368-377)
352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
pub fn spawn_task_that_shows_spinner(
shared_writer: &mut SharedWriter,
task_name: &str,
delay: Duration,
) {
let mut interval = interval(delay);
let mut tick_counter = 0;
let max_tick_count = 30;
let line_sender = shared_writer.line_sender.clone();
let task_name = task_name.to_string();
let shared_writer_clone = shared_writer.clone();
tokio::spawn(async move {
// Create a spinner.
let maybe_spinner = Spinner::try_start(
format!(
"{} - This is a sample indeterminate progress message",
task_name
),
Duration::from_millis(100),
SpinnerStyle::default(),
Arc::new(StdMutex::new(stderr())),
shared_writer_clone,
)
.await;
loop {
// Wait for the interval duration (one tick).
interval.tick().await;
// Don't print more than `max_tick_count` times.
tick_counter += 1;
if tick_counter >= max_tick_count {
break;
}
// Display a message at every tick.
let msg = format!("[{task_name}] - [{tick_counter}] interval went off while spinner was spinning!\n");
let _ = line_sender
.send(LineControlSignal::Line(msg.into_bytes()))
.await;
}
if let Ok(Some(mut spinner)) = maybe_spinner {
let msg = format!("{} - Task ended. Resuming terminal and showing any output that was generated while spinner was active.", task_name);
let _ = spinner.stop(msg.as_str()).await;
}
});
}
sourcepub async fn stop(&mut self, final_message: &str) -> Result<()>
pub async fn stop(&mut self, final_message: &str) -> Result<()>
Examples found in repository?
examples/spinner.rs (line 97)
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
async fn example_with_concurrent_output(style: SpinnerStyle) -> miette::Result<()> {
let terminal_async = TerminalAsync::try_new("$ ").await?;
let terminal_async = terminal_async.expect("terminal is not fully interactive");
let address = "127.0.0.1:8000";
let message_trying_to_connect = format!(
"This is a sample indeterminate progress message: trying to connect to server on {}",
&address
);
let mut shared_writer = terminal_async.clone_shared_writer();
// Start spinner. Automatically pauses the terminal.
let mut maybe_spinner = Spinner::try_start(
message_trying_to_connect.clone(),
DELAY_UNIT,
style,
Arc::new(StdMutex::new(stderr())),
shared_writer.clone(),
)
.await?;
// Start another task, to simulate some async work, that uses a interval to display
// output, for a fixed amount of time, using `terminal_async.println_prefixed()`.
let _ = try_join!(tokio::spawn(async move {
// To calculate the delay.
let duration = ARTIFICIAL_UI_DELAY;
let start = Instant::now();
// Dropping the interval cancels it.
let mut interval = tokio::time::interval(Duration::from_millis(DELAY_MS * 5));
loop {
interval.tick().await;
let elapsed = start.elapsed();
if elapsed >= duration {
break;
}
let _ = writeln!(shared_writer, "⏳foo");
}
}));
// Stop spinner. Automatically resumes the terminal.
if let Some(spinner) = maybe_spinner.as_mut() {
spinner
.stop("This is a sample final message for the spinner component: Connected to server")
.await?;
}
tokio::time::sleep(Duration::from_millis(500)).await;
Ok(())
}
More examples
examples/terminal_async.rs (line 399)
352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
pub fn spawn_task_that_shows_spinner(
shared_writer: &mut SharedWriter,
task_name: &str,
delay: Duration,
) {
let mut interval = interval(delay);
let mut tick_counter = 0;
let max_tick_count = 30;
let line_sender = shared_writer.line_sender.clone();
let task_name = task_name.to_string();
let shared_writer_clone = shared_writer.clone();
tokio::spawn(async move {
// Create a spinner.
let maybe_spinner = Spinner::try_start(
format!(
"{} - This is a sample indeterminate progress message",
task_name
),
Duration::from_millis(100),
SpinnerStyle::default(),
Arc::new(StdMutex::new(stderr())),
shared_writer_clone,
)
.await;
loop {
// Wait for the interval duration (one tick).
interval.tick().await;
// Don't print more than `max_tick_count` times.
tick_counter += 1;
if tick_counter >= max_tick_count {
break;
}
// Display a message at every tick.
let msg = format!("[{task_name}] - [{tick_counter}] interval went off while spinner was spinning!\n");
let _ = line_sender
.send(LineControlSignal::Line(msg.into_bytes()))
.await;
}
if let Ok(Some(mut spinner)) = maybe_spinner {
let msg = format!("{} - Task ended. Resuming terminal and showing any output that was generated while spinner was active.", task_name);
let _ = spinner.stop(msg.as_str()).await;
}
});
}
Auto Trait Implementations§
impl Freeze for Spinner
impl !RefUnwindSafe for Spinner
impl Send for Spinner
impl Sync for Spinner
impl Unpin for Spinner
impl !UnwindSafe for Spinner
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
source§impl<T> FutureExt for T
impl<T> FutureExt for T
source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
Wrap the input message
T
in a tonic::Request
source§impl<D> OwoColorize for D
impl<D> OwoColorize for D
source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Set the foreground color generically Read more
source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Set the background color generically. Read more
source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Change the foreground color to black
source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Change the background color to black
source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Change the foreground color to red
source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Change the background color to red
source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Change the foreground color to green
source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Change the background color to green
source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Change the foreground color to yellow
source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Change the background color to yellow
source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Change the foreground color to blue
source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Change the background color to blue
source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Change the foreground color to magenta
source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Change the background color to magenta
source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Change the foreground color to purple
source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Change the background color to purple
source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Change the foreground color to cyan
source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Change the background color to cyan
source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Change the foreground color to white
source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Change the background color to white
source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Change the foreground color to the terminal default
source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Change the background color to the terminal default
source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Change the foreground color to bright black
source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Change the background color to bright black
source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Change the foreground color to bright red
source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Change the background color to bright red
source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Change the foreground color to bright green
source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Change the background color to bright green
source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Change the foreground color to bright yellow
source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Change the background color to bright yellow
source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Change the foreground color to bright blue
source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Change the background color to bright blue
source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Change the foreground color to bright magenta
source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Change the background color to bright magenta
source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Change the foreground color to bright purple
source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Change the background color to bright purple
source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Change the foreground color to bright cyan
source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Change the background color to bright cyan
source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Change the foreground color to bright white
source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Change the background color to bright white
source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Make the text bold
source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Make the text dim
source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Make the text italicized
source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Make the text italicized
source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Make the text blink
source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Make the text blink (but fast!)
source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Swap the foreground and background colors
Hide the text
source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Cross out the text
source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
Set the foreground color at runtime. Only use if you do not know which color will be used at
compile-time. If the color is constant, use either
OwoColorize::fg
or
a color-specific method, such as OwoColorize::green
, Read moresource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
Set the background color at runtime. Only use if you do not know what color to use at
compile-time. If the color is constant, use either
OwoColorize::bg
or
a color-specific method, such as OwoColorize::on_yellow
, Read moresource§fn fg_rgb<const R: u8, const G: u8, const B: u8>(
&self
) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>
fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>
Set the foreground color to a specific RGB value.
source§fn bg_rgb<const R: u8, const G: u8, const B: u8>(
&self
) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>
fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>
Set the background color to a specific RGB value.
source§fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>
fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>
Sets the foreground color to an RGB value.
source§fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>
fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>
Sets the background color to an RGB value.