From e3ffc7e321c2c8bd928a9aba6b17a29a8982c650 Mon Sep 17 00:00:00 2001 From: ad4m <94195860+ad4mx@users.noreply.github.com> Date: Sun, 29 Jan 2023 13:24:22 +0100 Subject: [PATCH] 0.7.0 (#18) * split each spinner into individual features (#17) * split into features (#15) * upaded documentation * readme changes --------- Co-authored-by: Haruki Jay Shimada --- Cargo.toml | 117 +++- README.md | 54 +- examples/all_spinners.rs | 11 - examples/simple.rs | 11 +- examples/stop_and_persist.rs | 11 +- examples/stream.rs | 11 +- src/lib.rs | 174 +++-- src/spinner_data.rs | 1209 ---------------------------------- src/spinner_enum.rs | 100 --- src/spinners.rs | 593 +++++++++++++++++ 10 files changed, 884 insertions(+), 1407 deletions(-) delete mode 100644 examples/all_spinners.rs delete mode 100644 src/spinner_data.rs delete mode 100644 src/spinner_enum.rs create mode 100644 src/spinners.rs diff --git a/Cargo.toml b/Cargo.toml index eddc327..5669725 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "spinoff" -version = "0.6.0" +version = "0.7.0" edition = "2021" authors = ["ad4m"] description = "Simple to use Rust library for displaying spinners in the terminal" @@ -13,7 +13,116 @@ categories = ["command-line-interface"] include = ["src/**/*", "README.md"] [dependencies] -maplit = "1.0.2" -strum = { version = "0.24.0", features = ["derive"] } once_cell = "1.13.0" -colored = "2.0.0" \ No newline at end of file +colored = "2.0.0" +paste = "1.0.11" + +[features] +default = ["all"] + +all = [ + "dots", "dots2", "dots3", "dots4", "dots5", "dots6", "dots7", "dots8", "dots9", + "dots10", "dots11", "dots12", "dots8bit", "line", "line2", "pipe", "simple_dots", + "simple_dots_scrolling", "star", "star2", "flip", "hamburger", "grow_verticle", + "grow_horizontal", "balloon", "balloon2", "noise", "bounce", "box_bounce", + "box_bounce2", "triangle", "arc", "circle", "square_corners", "circle_quarters", + "circle_halves", "squish", "toggle", "toggle2", "toggle3", "toggle4", "toggle5", + "toggle6", "toggle7", "toggle8", "toggle9", "toggle10", "toggle11", "toggle12", + "toggle13", "arrow", "arrow2", "arrow3", "bouncing_bar", "bouncing_ball", + "smiley", "monkey", "hearts", "clock", "earth", "moon", "runner", "pong", "shark", + "material", "weather", "christmas", "grenade", "point", "layer", "beta_wave", + "finger_dance", "fist_bump", "dqpb", "soccer_header", "mindblown", "speaker", + "orange_pulse", "blue_pulse", "orange_blue_pulse", "time_travel", "aesthetic", + "binary", "cute" +] + +dots = [] +dots2 = [] +dots3 = [] +dots4 = [] +dots5 = [] +dots6 = [] +dots7 = [] +dots8 = [] +dots9 = [] +dots10 = [] +dots11 = [] +dots12 = [] +dots8bit = [] + +line = [] +line2 = [] +pipe = [] + +simple_dots = [] +simple_dots_scrolling = [] + +star = [] +star2 = [] +flip = [] +hamburger = [] +grow_horizontal = [] +grow_verticle = [] +balloon = [] +balloon2 = [] +noise = [] +bounce = [] +box_bounce = [] +box_bounce2 = [] +triangle = [] +arc = [] +circle = [] +square_corners = [] +circle_quarters = [] +circle_halves = [] +squish = [] + +toggle = [] +toggle2 = [] +toggle3 = [] +toggle4 = [] +toggle5 = [] +toggle6 = [] +toggle7 = [] +toggle8 = [] +toggle9 = [] +toggle10 = [] +toggle11 = [] +toggle12 = [] +toggle13 = [] + +arrow = [] +arrow2 = [] +arrow3 = [] + +bouncing_bar = [] +bouncing_ball = [] +smiley = [] +monkey = [] +hearts = [] +clock = [] +earth = [] +moon = [] +runner = [] +material = [] +pong = [] +shark = [] +weather = [] +christmas = [] +grenade = [] +point = [] +layer = [] +beta_wave = [] +finger_dance = [] +fist_bump = [] +dqpb = [] +soccer_header = [] +mindblown = [] +speaker = [] +orange_pulse = [] +blue_pulse = [] +orange_blue_pulse = [] +time_travel = [] +aesthetic = [] +binary = [] +cute = [] diff --git a/README.md b/README.md index 48128a1..24ac1e1 100644 --- a/README.md +++ b/README.md @@ -10,17 +10,17 @@ Add as a dependency to your `Cargo.toml`: ```toml [dependencies] -spinoff = "0.6.0" +spinoff = "0.7.0" ``` ## โšก Usage ```rust -use spinoff::{Spinner, Spinners, Color}; +use spinoff::{Spinner, spinners, Color}; use std::thread::sleep; use std::time::Duration; -let spinner = Spinner::new(Spinners::Dots, "Loading...", Color::Blue); +let spinner = Spinner::new(spinners::Dots, "Loading...", Color::Blue); sleep(Duration::from_secs(3)); spinner.success("Done!"); ``` @@ -28,42 +28,55 @@ spinner.success("Done!"); ### Update a spinner ```rust -use spinoff::{Spinner, Spinners, Color}; +use spinoff::{Spinner, spinners, Color}; use std::thread::sleep; use std::time::Duration; -let mut spinner = Spinner::new(Spinners::Aesthetic, "Loading...", Color::Red); +let mut spinner = Spinner::new(spinners::Aesthetic, "Loading...", Color::Red); sleep(Duration::from_secs(3)); spinner.update(Spinners::Dots2, "Retrying...", None); sleep(Duration::from_secs(3)); spinner.stop() ``` -### Stop a spinner and persist a symbol and message +### Specify an output stream ```rust -use spinoff::{Spinner, Spinners, Color}; +use spinoff::{Spinner, spinners, Color, Streams}; use std::thread::sleep; use std::time::Duration; -let spinner = Spinner::new(Spinners::Arc, "Loading...", Color::Green); +let spinner = Spinner::new_with_stream(spinners::Line, "Loading...", Color::Yellow, Streams::Stderr); sleep(Duration::from_secs(3)); spinner.stop_and_persist("๐Ÿ“œ", "Task done."); ``` -### Specify an output stream +## ๐Ÿ’ซ Spinners +*Note: This has been introduced in version 0.7.0* + +All spinner variants are treated as features that can be enabled or disabled. By default, all of them are enabled for ease of use. +To disable/enable variants, you will have to edit your `cargo.toml` file: + +```toml +[dependencies] +spinoff = { version = "0.7.0", features = ["dots, arc, line"] } +``` + +### Creating your own spinner +You can create your own spinner using the `spinner!` macro: ```rust -use spinoff::{Spinner, Spinners, Color, Streams}; +use spinoff::*; use std::thread::sleep; use std::time::Duration; -let spinner = Spinner::new_with_stream(Spinners::Line, "Loading...", Color::Yellow, Streams::Stderr); -sleep(Duration::from_secs(3)); -spinner.stop_and_persist("๐Ÿ“œ", "Task done."); +let frames = spinner!([">", ">>", ">>>"], 100); +let sp = Spinner::new(frames, "Hello World!", None); +sleep(Duration::from_millis(800)); +sp.stop(); ``` -### โ—Note for Windows Users +## โ—Note for Windows Users For colors to work properly, you need to add a few extra lines to your code: ```rust use colored::control @@ -76,18 +89,19 @@ Other examples can be found in the [documentation](https://docs.rs/spinoff/lates ## ๐Ÿ“– Documentation * All relevant documentation can be found on the [Docs.rs page](https://docs.rs/spinoff/latest/spinoff/). -* If you want to see all the available `Spinner` options, check the [`Spinners`](src/spinner_enum.rs) enum. +* If you want to see all the available `spinner` options, refer to [the source code](src/spinners.rs). ## โš™ Examples -To run some of the included examples, use: -```bash -cargo run --example all_spinners -``` - ```bash cargo run --example simple ``` +```bash +cargo run --example stream +``` +```bash +cargo run --example stop_and_persist +``` ## ๐Ÿšง Contributing diff --git a/examples/all_spinners.rs b/examples/all_spinners.rs deleted file mode 100644 index 4fba05a..0000000 --- a/examples/all_spinners.rs +++ /dev/null @@ -1,11 +0,0 @@ -use spinoff::{Spinner, Spinners}; -use std::{thread::sleep, time::Duration}; -use strum::IntoEnumIterator; - -fn main() { - for spinner in Spinners::iter() { - let spin = Spinner::new(spinner, format!("{}", spinner), None); - sleep(Duration::from_secs(2)); - spin.clear(); - } -} diff --git a/examples/simple.rs b/examples/simple.rs index 30a2dcf..726a6bf 100644 --- a/examples/simple.rs +++ b/examples/simple.rs @@ -1,8 +1,15 @@ -use spinoff::{Color, Spinner, Spinners}; +#![allow(unused_imports)] +use spinoff::{spinners, Color, Spinner}; use std::{thread::sleep, time::Duration}; +#[cfg(feature = "dots")] fn main() { - let sp = Spinner::new(Spinners::Dots, "Loading...", Color::Blue); + let sp = Spinner::new(spinners::Dots, "Loading...", Color::Blue); sleep(Duration::from_millis(8000)); sp.success("Done!"); } + +#[cfg(not(feature = "dots"))] +fn main() { + println!("This example requires the 'dots' feature to be enabled."); +} diff --git a/examples/stop_and_persist.rs b/examples/stop_and_persist.rs index 628de3a..d01698a 100644 --- a/examples/stop_and_persist.rs +++ b/examples/stop_and_persist.rs @@ -1,8 +1,15 @@ -use spinoff::{Color, Spinner, Spinners}; +#![allow(unused_imports)] +use spinoff::{spinners, Color, Spinner}; use std::{thread::sleep, time::Duration}; +#[cfg(feature = "arc")] fn main() { - let sp = Spinner::new(Spinners::Arc, "Loading...", Color::Blue); + let sp = Spinner::new(spinners::Arc, "Loading...", Color::Blue); sleep(Duration::from_secs(5)); sp.stop_and_persist("๐Ÿ•", "Pizza!"); } + +#[cfg(not(feature = "arc"))] +fn main() { + println!("This example requires the 'arc' feature to be enabled."); +} diff --git a/examples/stream.rs b/examples/stream.rs index 734760e..f1fd6e5 100644 --- a/examples/stream.rs +++ b/examples/stream.rs @@ -1,8 +1,15 @@ -use spinoff::{Spinner, Spinners, Streams}; +#![allow(unused_imports)] +use spinoff::{spinners, Spinner, Streams}; use std::{thread::sleep, time::Duration}; +#[cfg(feature = "aesthetic")] fn main() { - let sp = Spinner::new_with_stream(Spinners::Aesthetic, "Loading in stderr...", None, Streams::Stderr); + let sp = Spinner::new_with_stream(spinners::Aesthetic, "Loading in stderr...", None, Streams::Stderr); sleep(Duration::from_millis(8000)); sp.success("Done!"); } + +#[cfg(not(feature = "aesthetic"))] +fn main() { + println!("This example requires the 'aesthetic' feature to be enabled."); +} diff --git a/src/lib.rs b/src/lib.rs index e49386b..c05bc52 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,14 +10,32 @@ # use std::thread::sleep; # use std::time::Duration; # -let sp = Spinner::new(Spinners::Dots, "Loading...", None); +let sp = Spinner::new(spinners::Dots, "Loading...", None); sleep(Duration::from_millis(800)); sp.success("Success!"); ``` ### Spinners -There are over 80+ spinners available in the [`Spinners`] enum. +This crate provides 80+ spinners out of the box, which you can find in the +[`spinners`] module. + +Each spinner provided in this crate is broken up into its own feature. For +example, if you want to use the `dots9` spinner, you need to enable the `dots9` +feature in your `Cargo.toml` (the `dots` feature is enabled by default). + +If you want to use a custom spinner, you can use the [`spinner!`] macro. + +``` +# use spinoff::*; +# use std::thread::sleep; +# use std::time::Duration; +# +let frames = spinner!([">", ">>", ">>>"], 100); +let sp = Spinner::new(frames, "Loading...", None); +sleep(Duration::from_millis(800)); +sp.success("Success!"); +``` ### Colors @@ -35,33 +53,61 @@ use colored::Colorize; use std::borrow::Cow; use std::io::Write; use std::sync::{atomic::AtomicBool, Arc}; +use std::thread::sleep; use std::thread::{self, JoinHandle}; use std::time::Duration; -use std::thread::sleep; -mod utils; -mod spinner_data; -mod spinner_enum; +pub mod spinners; mod streams; +mod utils; +use spinners::SpinnerFrames; +pub use streams::Streams; pub use utils::Color; use utils::{colorize, delete_last_line}; -use spinner_data::SPINNER_FRAMES; -pub use spinner_enum::Spinners; -pub use streams::Streams; /// Terminal spinner. -#[derive(Debug)] pub struct Spinner { thread_handle: Option>, /// This struct has an `Arc` field, which is later used in the `stop` type methods to stop the thread printing the spinner. still_spinning: Arc, - spinner_type: Spinners, + spinner_frames: SpinnerFrames, msg: Cow<'static, str>, stream: Streams, color: Option, } +/** +Create a new `SpinnerFrames` struct + +# Arguments + +* `frames` - An array of frames you want to use +* `interval` - The time (in milliseconds) that will pass between frames + +# Example + +``` +# use spinoff::*; +# use std::thread::sleep; +# use std::time::Duration; +# +let frames = spinner!([">", ">>", ">>>"], 100); +let sp = Spinner::new(frames, "Hello World!", None); +sleep(Duration::from_millis(800)); +sp.stop(); +``` + */ +#[macro_export] +macro_rules! spinner { + ( [ $( $frame:expr ),* ], $interval:expr ) => { + spinners::SpinnerFrames { + interval: $interval, + frames: vec![$($frame),*] + } + }; +} + impl Spinner { /** Create a new spinner. @@ -79,7 +125,7 @@ impl Spinner { # use std::thread::sleep; # use std::time::Duration; # - let sp = Spinner::new(Spinners::Dots, "Hello World!", Color::Blue); + let sp = Spinner::new(spinners::Dots, "Hello World!", Color::Blue); sleep(Duration::from_millis(800)); sp.stop(); ``` @@ -89,8 +135,9 @@ impl Spinner { * The spinner immediately starts spinning upon creation. * This function outputs to the `stdout` stream. If you want to use a different stream, use the [`Spinner::new_with_stream`] function. */ - pub fn new(spinner_type: Spinners, msg: T, color: U) -> Self + pub fn new(spinner_type: S, msg: T, color: U) -> Self where + S: Into, T: Into>, U: Into>, { @@ -113,7 +160,7 @@ impl Spinner { # use std::thread::sleep; # use std::time::Duration; # - let sp = Spinner::new_with_stream(Spinners::Dots, "I'm outputting to stderr!", Color::Yellow, Streams::Stderr); + let sp = Spinner::new_with_stream(spinners::Dots, "I'm outputting to stderr!", Color::Yellow, Streams::Stderr); sleep(Duration::from_millis(800)); sp.clear(); ``` @@ -123,26 +170,26 @@ impl Spinner { * The spinner immediately starts spinning upon creation. */ - pub fn new_with_stream(spinner_type: Spinners, msg: T, color: U, stream: Streams) -> Self + pub fn new_with_stream(spinner_type: S, msg: T, color: U, stream: Streams) -> Self where + S: Into, T: Into>, U: Into>, { let still_spinning = Arc::new(AtomicBool::new(true)); // Gain ownership of the message and color for the thread to use + let spinner_frames = spinner_type.into(); let msg = msg.into(); let color = color.into(); // We use atomic bools to make the thread stop itself when the `spinner.stop()` method is called. let handle = thread::spawn({ // Clone the atomic bool so that we can use it in the thread and return the original one later. let still_spinning = Arc::clone(&still_spinning); + let spinner_frames = spinner_frames.clone(); let msg = msg.clone(); move || { - let spinner_data = SPINNER_FRAMES - .get(&spinner_type) - .expect("error: invalid spinner type"); // Iterate over all the frames of the spinner while the atomic bool is true. - let frames = spinner_data + let frames = spinner_frames .frames .iter() .cycle() @@ -161,7 +208,7 @@ impl Spinner { .expect("error: failed to flush stream"); thread::sleep(std::time::Duration::from_millis( - u64::from(spinner_data.interval) + u64::from(spinner_frames.interval) )); } delete_last_line(last_length, stream); @@ -172,7 +219,7 @@ impl Spinner { Self { thread_handle: Some(handle), still_spinning, - spinner_type, + spinner_frames, msg, stream, color, @@ -184,13 +231,14 @@ impl Spinner { # Example ``` - # use spinoff::{Spinners, Spinner}; + # use spinoff::{spinners, Spinner}; # use std::thread::sleep; # use std::time::Duration; # - let sp = Spinner::new(Spinners::Dots9, "Spinning...", None); + let sp = Spinner::new(spinners::Dots9, "Spinning...", None); sleep(Duration::from_millis(800)); sp.stop(); + # } ``` # Notes @@ -206,17 +254,18 @@ impl Spinner { /** Stops the spinner and prints a message on a new line. - + # Example ``` - # use spinoff::{Spinners, Spinner}; + # use spinoff::{spinners, Spinner}; # use std::thread::sleep; # use std::time::Duration; # - let sp = Spinner::new(Spinners::Dots2, "Hello", None); + let sp = Spinner::new(spinners::Dots2, "Hello", None); sleep(Duration::from_millis(800)); sp.stop_with_message("Bye"); + # ``` */ @@ -232,13 +281,14 @@ impl Spinner { # Example ``` - # use spinoff::{Spinners, Spinner}; + # use spinoff::{spinners, Spinner}; # use std::thread::sleep; # use std::time::Duration; # - let sp = Spinner::new(Spinners::Mindblown, "Guess what's coming...", None); + let sp = Spinner::new(spinners::Mindblown, "Guess what's coming...", None); sleep(Duration::from_millis(800)); sp.stop_and_persist("๐Ÿ•", "Pizza!"); + # ``` */ @@ -253,13 +303,14 @@ impl Spinner { # Example ``` - # use spinoff::{Spinners, Spinner}; + # use spinoff::{spinners, Spinner}; # use std::thread::sleep; # use std::time::Duration; - # - let sp = Spinner::new(Spinners::Aesthetic, "Trying to load information...", None); + # + let sp = Spinner::new(spinners::Aesthetic, "Trying to load information...", None); sleep(Duration::from_millis(800)); sp.success("Success!"); + # ``` */ @@ -270,17 +321,18 @@ impl Spinner { /** Deletes the last line of the terminal and prints a failure symbol with a message to stderr. - + # Example ``` - # use spinoff::{Spinners, Spinner, Color}; + # use spinoff::{spinners, Spinner, Color}; # use std::thread::sleep; # use std::time::Duration; - # - let sp = Spinner::new(Spinners::BouncingBar, "Executing code...", Color::Green); + # + let sp = Spinner::new(spinners::BouncingBar, "Executing code...", Color::Green); sleep(Duration::from_millis(800)); sp.fail("Code failed to compile!"); + # ``` */ @@ -291,17 +343,18 @@ impl Spinner { /** Deletes the last line of the terminal and prints a warning symbol with a message. - + # Example ``` - # use spinoff::{Spinners, Spinner}; + # use spinoff::{spinners, Spinner}; # use std::thread::sleep; # use std::time::Duration; - # - let sp = Spinner::new(Spinners::Material, "Measuring network speed...", None); + # + let sp = Spinner::new(spinners::Material, "Measuring network speed...", None); sleep(Duration::from_millis(800)); sp.warn("You might want to check your internet connection..."); + # ``` */ @@ -315,13 +368,14 @@ impl Spinner { # Example ``` - # use spinoff::{Spinners, Spinner}; + # use spinoff::{spinners, Spinner}; # use std::thread::sleep; # use std::time::Duration; - - let sp = Spinner::new(Spinners::Dots9, "Loading info message...", None); + # + let sp = Spinner::new(spinners::Dots9, "Loading info message...", None); sleep(Duration::from_millis(800)); - sp.info("This is an info message!"); + sp.info("This is an info message!"); + # ``` */ @@ -339,19 +393,21 @@ impl Spinner { # use spinoff::*; # use std::thread::sleep; # use std::time::Duration; - # - let mut sp = Spinner::new(Spinners::Dots, "Hello", None); + # + let mut sp = Spinner::new(spinners::Dots, "Hello", None); sleep(Duration::from_millis(800)); - sp.update(Spinners::Dots2, "World", None); + sp.update(spinners::Dots2, "World", None); sleep(Duration::from_millis(800)); sp.stop(); + # ``` */ - pub fn update(&mut self, spinner: Spinners, msg: T, color: U) + pub fn update(&mut self, spinner: S, msg: T, color: U) where + S: Into, T: Into>, U: Into>, { @@ -372,13 +428,15 @@ impl Spinner { # use std::thread::sleep; # use std::time::Duration; # - let mut sp = Spinner::new(Spinners::Arc, "Loading...", Color::Magenta); + let mut sp = Spinner::new(spinners::Arc, "Loading...", Color::Magenta); sleep(Duration::from_millis(800)); sp.update_text("Not quite finished..."); sleep(Duration::from_millis(800)); sp.update_text("Almost done..."); sleep(Duration::from_millis(800)); sp.success("Done!"); + # + ``` */ pub fn update_text(&mut self, msg: T) @@ -388,7 +446,7 @@ impl Spinner { self.stop_spinner_thread(); let _replaced = std::mem::replace( self, - Self::new_with_stream(self.spinner_type, msg, self.color, self.stream), + Self::new_with_stream(self.spinner_frames.clone(), msg, self.color, self.stream), ); } /** @@ -401,10 +459,11 @@ impl Spinner { # use std::thread::sleep; # use std::time::Duration; # - let mut sp = Spinner::new(Spinners::Arc, "Loading...", Color::Blue); + let mut sp = Spinner::new(spinners::Arc, "Loading...", Color::Blue); sp.update_after_time("Not Done Yet...", Duration::from_secs(2)); sleep(Duration::from_millis(800)); sp.success("Done!"); + # ``` # Notes @@ -412,30 +471,31 @@ impl Spinner { * This could be used to assure the user that the program is still running. */ - pub fn update_after_time(&mut self, updated_msg: T, duration: Duration) + pub fn update_after_time(&mut self, updated_msg: T, duration: Duration) where - T: Into> + T: Into> { sleep(duration); self.stop_spinner_thread(); let _ = std::mem::replace( - self, - Self::new_with_stream(self.spinner_type, updated_msg, self.color, self.stream) + self, + Self::new_with_stream(self.spinner_frames.clone(), updated_msg, self.color, self.stream), ); } /** Deletes the last line of the terminal. - + # Example ``` - # use spinoff::{Spinners, Spinner}; + # use spinoff::{spinners, Spinner}; # use std::thread::sleep; # use std::time::Duration; # - let sp = Spinner::new(Spinners::Grenade, "Clearing...", None); + let sp = Spinner::new(spinners::Grenade, "Clearing...", None); sleep(Duration::from_millis(800)); sp.clear(); + # ``` */ diff --git a/src/spinner_data.rs b/src/spinner_data.rs deleted file mode 100644 index 60f858f..0000000 --- a/src/spinner_data.rs +++ /dev/null @@ -1,1209 +0,0 @@ -use crate::spinner_enum::Spinners; -use maplit::{self, hashmap}; -use once_cell::sync::Lazy; -use std::collections::HashMap; - -/// A Struct that contains the data for a spinner. -/// Frames is a Vec of &str, each &str is a frame of the spinner. -/// Interval is the number of milliseconds to wait before moving to the next frame. -pub struct SpinnerFrames { - pub frames: Vec<&'static str>, - pub interval: u16, -} - -/// A `HashMap` of all the spinners from the Spinners enum and their data. -/// The reason for using a `HashMap` instead of something like a JSON file is -/// because there's no need for extra files and/or crates for parsing data. -pub static SPINNER_FRAMES: Lazy> = Lazy::new(|| { - hashmap! { - Spinners::Dots => SpinnerFrames {frames: vec![ - "โ ‹", - "โ ™", - "โ น", - "โ ธ", - "โ ผ", - "โ ด", - "โ ฆ", - "โ ง", - "โ ‡", - "โ " - ], interval: 80}, - Spinners::Dots2 => SpinnerFrames {frames: vec![ - "โ ‹", - "โ ™", - "โ š", - "โ ž", - "โ –", - "โ ฆ", - "โ ด", - "โ ฒ", - "โ ณ", - "โ “" - ], interval: 80}, - Spinners::Dots3 => SpinnerFrames {frames: vec![ - "โ ‹", - "โ ™", - "โ š", - "โ ž", - "โ –", - "โ ฆ", - "โ ด", - "โ ฒ", - "โ ณ", - "โ “" - ], interval: 80}, - Spinners::Dots4 => SpinnerFrames {frames: vec![ - "โ „", - "โ †", - "โ ‡", - "โ ‹", - "โ ™", - "โ ธ", - "โ ฐ", - "โ  ", - "โ ฐ", - "โ ธ", - "โ ™", - "โ ‹", - "โ ‡", - "โ †" - ], interval: 80}, - Spinners::Dots5 => SpinnerFrames {frames: vec![ - "โ ‹", - "โ ™", - "โ š", - "โ ’", - "โ ‚", - "โ ‚", - "โ ’", - "โ ฒ", - "โ ด", - "โ ฆ", - "โ –", - "โ ’", - "โ ", - "โ ", - "โ ’", - "โ “", - "โ ‹" - ], interval: 80}, - Spinners::Dots6 => SpinnerFrames {frames: vec![ - "โ ", - "โ ‰", - "โ ™", - "โ š", - "โ ’", - "โ ‚", - "โ ‚", - "โ ’", - "โ ฒ", - "โ ด", - "โ ค", - "โ „", - "โ „", - "โ ค", - "โ ด", - "โ ฒ", - "โ ’", - "โ ‚", - "โ ‚", - "โ ’", - "โ š", - "โ ™", - "โ ‰", - "โ " - ], interval: 80}, - Spinners::Dots7 => SpinnerFrames {frames: vec![ - "โ ˆ", - "โ ‰", - "โ ‹", - "โ “", - "โ ’", - "โ ", - "โ ", - "โ ’", - "โ –", - "โ ฆ", - "โ ค", - "โ  ", - "โ  ", - "โ ค", - "โ ฆ", - "โ –", - "โ ’", - "โ ", - "โ ", - "โ ’", - "โ “", - "โ ‹", - "โ ‰", - "โ ˆ" - ], interval: 80}, - Spinners::Dots8 => SpinnerFrames {frames: vec![ - "โ ", - "โ ", - "โ ‰", - "โ ™", - "โ š", - "โ ’", - "โ ‚", - "โ ‚", - "โ ’", - "โ ฒ", - "โ ด", - "โ ค", - "โ „", - "โ „", - "โ ค", - "โ  ", - "โ  ", - "โ ค", - "โ ฆ", - "โ –", - "โ ’", - "โ ", - "โ ", - "โ ’", - "โ “", - "โ ‹", - "โ ‰", - "โ ˆ", - "โ ˆ" - ], interval: 80}, - Spinners::Dots9 => SpinnerFrames {frames: vec![ - "โขน", - "โขบ", - "โขผ", - "โฃธ", - "โฃ‡", - "โกง", - "โก—", - "โก" - ], interval: 80}, - Spinners::Dots10 => SpinnerFrames {frames: vec![ - "โข„", - "โข‚", - "โข", - "โก", - "โกˆ", - "โก", - "โก " - ], interval: 80}, - Spinners::Dots11 => SpinnerFrames {frames: vec![ - "โ ", - "โ ‚", - "โ „", - "โก€", - "โข€", - "โ  ", - "โ ", - "โ ˆ" - ], interval: 100}, - Spinners::Dots12 => SpinnerFrames {frames: vec![ - "โข€โ €", - "โก€โ €", - "โ „โ €", - "โข‚โ €", - "โก‚โ €", - "โ …โ €", - "โขƒโ €", - "โกƒโ €", - "โ โ €", - "โข‹โ €", - "โก‹โ €", - "โ โ ", - "โข‹โ ", - "โก‹โ ", - "โ โ ‰", - "โ ‹โ ‰", - "โ ‹โ ‰", - "โ ‰โ ™", - "โ ‰โ ™", - "โ ‰โ ฉ", - "โ ˆโข™", - "โ ˆโก™", - "โขˆโ ฉ", - "โก€โข™", - "โ „โก™", - "โข‚โ ฉ", - "โก‚โข˜", - "โ …โก˜", - "โขƒโ จ", - "โกƒโข", - "โ โก", - "โข‹โ  ", - "โก‹โข€", - "โ โก", - "โข‹โ ", - "โก‹โ ", - "โ โ ‰", - "โ ‹โ ‰", - "โ ‹โ ‰", - "โ ‰โ ™", - "โ ‰โ ™", - "โ ‰โ ฉ", - "โ ˆโข™", - "โ ˆโก™", - "โ ˆโ ฉ", - "โ €โข™", - "โ €โก™", - "โ €โ ฉ", - "โ €โข˜", - "โ €โก˜", - "โ €โ จ", - "โ €โข", - "โ €โก", - "โ €โ  ", - "โ €โข€", - "โ €โก€" - ], interval: 80}, - Spinners::Dots8Bit => SpinnerFrames {frames: vec![ - "โ €", - "โ ", - "โ ‚", - "โ ƒ", - "โ „", - "โ …", - "โ †", - "โ ‡", - "โก€", - "โก", - "โก‚", - "โกƒ", - "โก„", - "โก…", - "โก†", - "โก‡", - "โ ˆ", - "โ ‰", - "โ Š", - "โ ‹", - "โ Œ", - "โ ", - "โ Ž", - "โ ", - "โกˆ", - "โก‰", - "โกŠ", - "โก‹", - "โกŒ", - "โก", - "โกŽ", - "โก", - "โ ", - "โ ‘", - "โ ’", - "โ “", - "โ ”", - "โ •", - "โ –", - "โ —", - "โก", - "โก‘", - "โก’", - "โก“", - "โก”", - "โก•", - "โก–", - "โก—", - "โ ˜", - "โ ™", - "โ š", - "โ ›", - "โ œ", - "โ ", - "โ ž", - "โ Ÿ", - "โก˜", - "โก™", - "โกš", - "โก›", - "โกœ", - "โก", - "โกž", - "โกŸ", - "โ  ", - "โ ก", - "โ ข", - "โ ฃ", - "โ ค", - "โ ฅ", - "โ ฆ", - "โ ง", - "โก ", - "โกก", - "โกข", - "โกฃ", - "โกค", - "โกฅ", - "โกฆ", - "โกง", - "โ จ", - "โ ฉ", - "โ ช", - "โ ซ", - "โ ฌ", - "โ ญ", - "โ ฎ", - "โ ฏ", - "โกจ", - "โกฉ", - "โกช", - "โกซ", - "โกฌ", - "โกญ", - "โกฎ", - "โกฏ", - "โ ฐ", - "โ ฑ", - "โ ฒ", - "โ ณ", - "โ ด", - "โ ต", - "โ ถ", - "โ ท", - "โกฐ", - "โกฑ", - "โกฒ", - "โกณ", - "โกด", - "โกต", - "โกถ", - "โกท", - "โ ธ", - "โ น", - "โ บ", - "โ ป", - "โ ผ", - "โ ฝ", - "โ พ", - "โ ฟ", - "โกธ", - "โกน", - "โกบ", - "โกป", - "โกผ", - "โกฝ", - "โกพ", - "โกฟ", - "โข€", - "โข", - "โข‚", - "โขƒ", - "โข„", - "โข…", - "โข†", - "โข‡", - "โฃ€", - "โฃ", - "โฃ‚", - "โฃƒ", - "โฃ„", - "โฃ…", - "โฃ†", - "โฃ‡", - "โขˆ", - "โข‰", - "โขŠ", - "โข‹", - "โขŒ", - "โข", - "โขŽ", - "โข", - "โฃˆ", - "โฃ‰", - "โฃŠ", - "โฃ‹", - "โฃŒ", - "โฃ", - "โฃŽ", - "โฃ", - "โข", - "โข‘", - "โข’", - "โข“", - "โข”", - "โข•", - "โข–", - "โข—", - "โฃ", - "โฃ‘", - "โฃ’", - "โฃ“", - "โฃ”", - "โฃ•", - "โฃ–", - "โฃ—", - "โข˜", - "โข™", - "โขš", - "โข›", - "โขœ", - "โข", - "โขž", - "โขŸ", - "โฃ˜", - "โฃ™", - "โฃš", - "โฃ›", - "โฃœ", - "โฃ", - "โฃž", - "โฃŸ", - "โข ", - "โขก", - "โขข", - "โขฃ", - "โขค", - "โขฅ", - "โขฆ", - "โขง", - "โฃ ", - "โฃก", - "โฃข", - "โฃฃ", - "โฃค", - "โฃฅ", - "โฃฆ", - "โฃง", - "โขจ", - "โขฉ", - "โขช", - "โขซ", - "โขฌ", - "โขญ", - "โขฎ", - "โขฏ", - "โฃจ", - "โฃฉ", - "โฃช", - "โฃซ", - "โฃฌ", - "โฃญ", - "โฃฎ", - "โฃฏ", - "โขฐ", - "โขฑ", - "โขฒ", - "โขณ", - "โขด", - "โขต", - "โขถ", - "โขท", - "โฃฐ", - "โฃฑ", - "โฃฒ", - "โฃณ", - "โฃด", - "โฃต", - "โฃถ", - "โฃท", - "โขธ", - "โขน", - "โขบ", - "โขป", - "โขผ", - "โขฝ", - "โขพ", - "โขฟ", - "โฃธ", - "โฃน", - "โฃบ", - "โฃป", - "โฃผ", - "โฃฝ", - "โฃพ", - "โฃฟ" - ], interval: 80}, - Spinners::Line => SpinnerFrames {frames: vec![ - "-", - "\\", - "|", - "/" - ], interval: 130}, - Spinners::Line2 => SpinnerFrames {frames: vec![ - "โ ‚", - "-", - "โ€“", - "โ€”", - "โ€“", - "-" - ], interval: 100}, - Spinners::Pipe => SpinnerFrames {frames: vec![ - "โ”ค", - "โ”˜", - "โ”ด", - "โ””", - "โ”œ", - "โ”Œ", - "โ”ฌ", - "โ”" - ], interval: 100}, - Spinners::SimpleDots => SpinnerFrames {frames: vec![ - ". ", - ".. ", - "...", - " " - ], interval: 400}, - Spinners::SimpleDotsScrolling => SpinnerFrames {frames: vec![ - ". ", - ".. ", - "...", - " ..", - " .", - " " - ], interval: 200}, - Spinners::Star => SpinnerFrames {frames: vec![ - "โœถ", - "โœธ", - "โœน", - "โœบ", - "โœน", - "โœท" - ], interval: 70}, - Spinners::Star2 => SpinnerFrames {frames: vec![ - "+", - "x", - "*" - ], interval: 80}, - Spinners::Flip => SpinnerFrames {frames: vec![ - "_", - "_", - "_", - "-", - "`", - "`", - "'", - "ยด", - "-", - "_", - "_", - "_" - ], interval: 70}, - Spinners::Hamburger => SpinnerFrames {frames: vec![ - "โ˜ฑ", - "โ˜ฒ", - "โ˜ด" - ], interval: 100}, - Spinners::GrowVertical => SpinnerFrames {frames: vec![ - "โ–", - "โ–ƒ", - "โ–„", - "โ–…", - "โ–†", - "โ–‡", - "โ–†", - "โ–…", - "โ–„", - "โ–ƒ" - ], interval: 120}, - Spinners::GrowHorizontal => SpinnerFrames {frames: vec![ - "โ–", - "โ–Ž", - "โ–", - "โ–Œ", - "โ–‹", - "โ–Š", - "โ–‰", - "โ–Š", - "โ–‹", - "โ–Œ", - "โ–", - "โ–Ž" - ], interval: 120}, - Spinners::Balloon => SpinnerFrames {frames: vec![ - " ", - ".", - "o", - "O", - "@", - "*", - " " - ], interval: 140}, - Spinners::Balloon2 => SpinnerFrames {frames: vec![ - ".", - "o", - "O", - "ยฐ", - "O", - "o", - "." - ], interval: 120}, - Spinners::Noise => SpinnerFrames {frames: vec![ - "โ–“", - "โ–’", - "โ–‘" - ], interval: 100}, - Spinners::Bounce => SpinnerFrames {frames: vec![ - "โ ", - "โ ‚", - "โ „", - "โ ‚" - ], interval: 120}, - Spinners::BoxBounce => SpinnerFrames {frames: vec![ - "โ––", - "โ–˜", - "โ–", - "โ–—" - ], interval: 120}, - Spinners::BoxBounce2 => SpinnerFrames {frames: vec![ - "โ–Œ", - "โ–€", - "โ–", - "โ–„" - ], interval: 100}, - Spinners::Triangle => SpinnerFrames {frames: vec![ - "โ—ข", - "โ—ฃ", - "โ—ค", - "โ—ฅ" - ], interval: 50}, - Spinners::Arc => SpinnerFrames {frames: vec![ - "โ—œ", - "โ— ", - "โ—", - "โ—ž", - "โ—ก", - "โ—Ÿ" - ], interval: 100}, - Spinners::Circle => SpinnerFrames {frames: vec![ - "โ—ก", - "โŠ™", - "โ— " - ], interval: 120}, - Spinners::SquareCorners => SpinnerFrames {frames: vec![ - "โ—ฐ", - "โ—ณ", - "โ—ฒ", - "โ—ฑ" - ], interval: 180}, - Spinners::CircleQuarters => SpinnerFrames {frames: vec![ - "โ—ด", - "โ—ท", - "โ—ถ", - "โ—ต" - ], interval: 120}, - Spinners::CircleHalves => SpinnerFrames {frames: vec![ - "โ—", - "โ—“", - "โ—‘", - "โ—’" - ], interval: 50}, - Spinners::Squish => SpinnerFrames {frames: vec![ - "โ•ซ", - "โ•ช" - ], interval: 100}, - Spinners::Toggle => SpinnerFrames {frames: vec![ - "โŠถ", - "โŠท" - ], interval: 250}, - Spinners::Toggle2 => SpinnerFrames {frames: vec![ - "โ–ซ", - "โ–ช" - ], interval: 80}, - Spinners::Toggle3 => SpinnerFrames {frames: vec![ - "โ–ก", - "โ– " - ], interval: 120}, - Spinners::Toggle4 => SpinnerFrames {frames: vec![ - "โ– ", - "โ–ก", - "โ–ช", - "โ–ซ" - ], interval: 100}, - Spinners::Toggle5 => SpinnerFrames {frames: vec![ - "โ–ฎ", - "โ–ฏ" - ], interval: 100}, - Spinners::Toggle6 => SpinnerFrames {frames: vec![ - "แ€", - "แ€" - ], interval: 300}, - Spinners::Toggle7 => SpinnerFrames {frames: vec![ - "โฆพ", - "โฆฟ" - ], interval: 80}, - Spinners::Toggle8 => SpinnerFrames {frames: vec![ - "โ—", - "โ—Œ" - ], interval: 100}, - Spinners::Toggle9 => SpinnerFrames {frames: vec![ - "โ—‰", - "โ—Ž" - ], interval: 100}, - Spinners::Toggle10 => SpinnerFrames {frames: vec![ - "ใŠ‚", - "ใŠ€", - "ใŠ" - ], interval: 100}, - Spinners::Toggle11 => SpinnerFrames {frames: vec![ - "โง‡", - "โง†" - ], interval: 50}, - Spinners::Toggle12 => SpinnerFrames {frames: vec![ - "โ˜—", - "โ˜–" - ], interval: 120}, - Spinners::Toggle13 => SpinnerFrames {frames: vec![ - "=", - "*", - "-" - ], interval: 80}, - Spinners::Arrow => SpinnerFrames {frames: vec![ - "โ†", - "โ†–", - "โ†‘", - "โ†—", - "โ†’", - "โ†˜", - "โ†“", - "โ†™" - ], interval: 100}, - Spinners::Arrow2 => SpinnerFrames {frames: vec![ - "โฌ†๏ธ ", - "โ†—๏ธ ", - "โžก๏ธ ", - "โ†˜๏ธ ", - "โฌ‡๏ธ ", - "โ†™๏ธ ", - "โฌ…๏ธ ", - "โ†–๏ธ " - ], interval: 80}, - Spinners::Arrow3 => SpinnerFrames {frames: vec![ - "โ–นโ–นโ–นโ–นโ–น", - "โ–ธโ–นโ–นโ–นโ–น", - "โ–นโ–ธโ–นโ–นโ–น", - "โ–นโ–นโ–ธโ–นโ–น", - "โ–นโ–นโ–นโ–ธโ–น", - "โ–นโ–นโ–นโ–นโ–ธ" - ], interval: 120}, - Spinners::BouncingBar => SpinnerFrames {frames: vec![ - "[ ]", - "[= ]", - "[== ]", - "[=== ]", - "[ ===]", - "[ ==]", - "[ =]", - "[ ]", - "[ =]", - "[ ==]", - "[ ===]", - "[====]", - "[=== ]", - "[== ]", - "[= ]" - ], interval: 80}, - Spinners::BouncingBall => SpinnerFrames {frames: vec![ - "( โ— )", - "( โ— )", - "( โ— )", - "( โ— )", - "( โ—)", - "( โ— )", - "( โ— )", - "( โ— )", - "( โ— )", - "(โ— )" - ], interval: 80}, - Spinners::Smiley => SpinnerFrames {frames: vec![ - "๐Ÿ˜„", - "๐Ÿ˜" - ], interval: 200}, - Spinners::Monkey => SpinnerFrames {frames: vec![ - "๐Ÿ™ˆ", - "๐Ÿ™ˆ", - "๐Ÿ™‰", - "๐Ÿ™Š" - ], interval: 300}, - Spinners::Hearts => SpinnerFrames {frames: vec![ - "๐Ÿ’›", - "๐Ÿ’™", - "๐Ÿ’œ", - "๐Ÿ’š", - "โค๏ธ" - ], interval: 100}, - Spinners::Clock => SpinnerFrames {frames: vec![ - "๐Ÿ•›", - "๐Ÿ•", - "๐Ÿ•‘", - "๐Ÿ•’", - "๐Ÿ•“", - "๐Ÿ•”", - "๐Ÿ••", - "๐Ÿ•–", - "๐Ÿ•—", - "๐Ÿ•˜", - "๐Ÿ•™", - "๐Ÿ•š" - ], interval: 100}, - Spinners::Earth => SpinnerFrames {frames: vec![ - "๐ŸŒ", - "๐ŸŒŽ", - "๐ŸŒ" - ], interval: 180}, - Spinners::Material => SpinnerFrames {frames: vec![ - "โ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", - "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", - "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", - "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", - "โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–", - "โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", - "โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", - "โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", - "โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", - "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", - "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", - "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", - "โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", - "โ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", - "โ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", - "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", - "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", - "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", - "โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–", - "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", - "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", - "โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", - "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–" - ], interval: 17}, - Spinners::Moon => SpinnerFrames {frames: vec![ - "๐ŸŒ‘", - "๐ŸŒ’", - "๐ŸŒ“", - "๐ŸŒ”", - "๐ŸŒ•", - "๐ŸŒ–", - "๐ŸŒ—", - "๐ŸŒ˜" - ], interval: 80}, - Spinners::Runner => SpinnerFrames {frames: vec![ - "๐Ÿšถ", - "๐Ÿƒ" - ], interval: 140}, - Spinners::Pong => SpinnerFrames {frames: vec![ - "โ–โ ‚ โ–Œ", - "โ–โ ˆ โ–Œ", - "โ– โ ‚ โ–Œ", - "โ– โ   โ–Œ", - "โ– โก€ โ–Œ", - "โ– โ   โ–Œ", - "โ– โ ‚ โ–Œ", - "โ– โ ˆ โ–Œ", - "โ– โ ‚ โ–Œ", - "โ– โ   โ–Œ", - "โ– โก€ โ–Œ", - "โ– โ   โ–Œ", - "โ– โ ‚ โ–Œ", - "โ– โ ˆ โ–Œ", - "โ– โ ‚โ–Œ", - "โ– โ  โ–Œ", - "โ– โก€โ–Œ", - "โ– โ   โ–Œ", - "โ– โ ‚ โ–Œ", - "โ– โ ˆ โ–Œ", - "โ– โ ‚ โ–Œ", - "โ– โ   โ–Œ", - "โ– โก€ โ–Œ", - "โ– โ   โ–Œ", - "โ– โ ‚ โ–Œ", - "โ– โ ˆ โ–Œ", - "โ– โ ‚ โ–Œ", - "โ– โ   โ–Œ", - "โ– โก€ โ–Œ", - "โ–โ   โ–Œ" - ], interval: 80}, - Spinners::Shark => SpinnerFrames {frames: vec![ - "โ–|\\____________โ–Œ", - "โ–_|\\___________โ–Œ", - "โ–__|\\__________โ–Œ", - "โ–___|\\_________โ–Œ", - "โ–____|\\________โ–Œ", - "โ–_____|\\_______โ–Œ", - "โ–______|\\______โ–Œ", - "โ–_______|\\_____โ–Œ", - "โ–________|\\____โ–Œ", - "โ–_________|\\___โ–Œ", - "โ–__________|\\__โ–Œ", - "โ–___________|\\_โ–Œ", - "โ–____________|\\โ–Œ", - "โ–____________/|โ–Œ", - "โ–___________/|_โ–Œ", - "โ–__________/|__โ–Œ", - "โ–_________/|___โ–Œ", - "โ–________/|____โ–Œ", - "โ–_______/|_____โ–Œ", - "โ–______/|______โ–Œ", - "โ–_____/|_______โ–Œ", - "โ–____/|________โ–Œ", - "โ–___/|_________โ–Œ", - "โ–__/|__________โ–Œ", - "โ–_/|___________โ–Œ", - "โ–/|____________โ–Œ" - ], interval: 120}, - Spinners::Dqpb => SpinnerFrames {frames: vec![ - "d", - "q", - "p", - "b" - ], interval: 100}, - Spinners::Weather => SpinnerFrames {frames: vec![ - "โ˜€๏ธ", - "โ˜€๏ธ", - "โ˜€๏ธ", - "๐ŸŒค", - "โ›…๏ธ", - "๐ŸŒฅ", - "โ˜๏ธ", - "๐ŸŒง", - "๐ŸŒจ", - "๐ŸŒง", - "๐ŸŒจ", - "๐ŸŒง", - "๐ŸŒจ", - "โ›ˆ", - "๐ŸŒจ", - "๐ŸŒง", - "๐ŸŒจ", - "โ˜๏ธ", - "๐ŸŒฅ", - "โ›…๏ธ", - "๐ŸŒค", - "โ˜€๏ธ", - "โ˜€๏ธ" - ], interval: 100}, - Spinners::Christmas => SpinnerFrames {frames: vec![ - "๐ŸŒฒ", - "๐ŸŽ„" - ], interval: 400}, - Spinners::Grenade => SpinnerFrames {frames: vec![ - "ุŒ ", - "โ€ฒ ", - " ยด ", - " โ€พ ", - " โธŒ", - " โธŠ", - " |", - " โŽ", - " โ•", - " เทด ", - " โ“", - " ", - " ", - " " - ], interval: 80}, - Spinners::Point => SpinnerFrames {frames: vec![ - "โˆ™โˆ™โˆ™", - "โ—โˆ™โˆ™", - "โˆ™โ—โˆ™", - "โˆ™โˆ™โ—", - "โˆ™โˆ™โˆ™" - ], interval: 125}, - Spinners::Layer => SpinnerFrames {frames: vec![ - "-", - "=", - "โ‰ก" - ], interval: 150}, - Spinners::BetaWave => SpinnerFrames {frames: vec![ - "ฯฮฒฮฒฮฒฮฒฮฒฮฒ", - "ฮฒฯฮฒฮฒฮฒฮฒฮฒ", - "ฮฒฮฒฯฮฒฮฒฮฒฮฒ", - "ฮฒฮฒฮฒฯฮฒฮฒฮฒ", - "ฮฒฮฒฮฒฮฒฯฮฒฮฒ", - "ฮฒฮฒฮฒฮฒฮฒฯฮฒ", - "ฮฒฮฒฮฒฮฒฮฒฮฒฯ" - ], interval: 80}, - Spinners::FingerDance => SpinnerFrames {frames: vec![ - "๐Ÿค˜", - "๐ŸคŸ", - "๐Ÿ––", - "โœ‹", - "๐Ÿคš", - "๐Ÿ‘†" - ], interval: 160}, - Spinners::FistBump => SpinnerFrames {frames: vec![ - "๐Ÿคœใ€€ใ€€ใ€€ใ€€๐Ÿค›", - "๐Ÿคœใ€€ใ€€ใ€€ใ€€๐Ÿค›", - "๐Ÿคœใ€€ใ€€ใ€€ใ€€๐Ÿค›", - "ใ€€๐Ÿคœใ€€ใ€€๐Ÿค›ใ€€", - "ใ€€ใ€€๐Ÿคœ๐Ÿค›ใ€€ใ€€", - "ใ€€๐Ÿคœโœจ๐Ÿค›ใ€€ ", - "๐Ÿคœใ€€โœจใ€€๐Ÿค› " - ], interval: 80}, - Spinners::SoccerHeader => SpinnerFrames {frames: vec![ - " ๐Ÿง‘โšฝ๏ธ ๐Ÿง‘", - "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘", - "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘", - "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘", - "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘", - "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘", - "๐Ÿง‘ โšฝ๏ธ๐Ÿง‘ ", - "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘", - "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘", - "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘", - "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘", - "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘" - ], interval: 80}, - Spinners::Mindblown => SpinnerFrames {frames: vec![ - "๐Ÿ˜", - "๐Ÿ˜", - "๐Ÿ˜ฎ", - "๐Ÿ˜ฎ", - "๐Ÿ˜ฆ", - "๐Ÿ˜ฆ", - "๐Ÿ˜ง", - "๐Ÿ˜ง", - "๐Ÿคฏ", - "๐Ÿ’ฅ", - "โœจ", - "ใ€€", - "ใ€€", - "ใ€€" - ], interval: 160}, - Spinners::Speaker => SpinnerFrames {frames: vec![ - "๐Ÿ”ˆ", - "๐Ÿ”‰", - "๐Ÿ”Š", - "๐Ÿ”‰" - ], interval: 160}, - Spinners::OrangePulse => SpinnerFrames {frames: vec![ - "๐Ÿ”ธ", - "๐Ÿ”ถ", - "๐ŸŸ ", - "๐ŸŸ ", - "๐Ÿ”ถ" - ], interval: 100}, - Spinners::BluePulse => SpinnerFrames {frames: vec![ - "๐Ÿ”น", - "๐Ÿ”ท", - "๐Ÿ”ต", - "๐Ÿ”ต", - "๐Ÿ”ท" - ], interval: 100}, - Spinners::OrangeBluePulse => SpinnerFrames {frames: vec![ - "๐Ÿ”ธ", - "๐Ÿ”ถ", - "๐ŸŸ ", - "๐ŸŸ ", - "๐Ÿ”ถ", - "๐Ÿ”น", - "๐Ÿ”ท", - "๐Ÿ”ต", - "๐Ÿ”ต", - "๐Ÿ”ท" - ], interval: 100}, - Spinners::TimeTravel => SpinnerFrames {frames: vec![ - "๐Ÿ•›", - "๐Ÿ•š", - "๐Ÿ•™", - "๐Ÿ•˜", - "๐Ÿ•—", - "๐Ÿ•–", - "๐Ÿ••", - "๐Ÿ•”", - "๐Ÿ•“", - "๐Ÿ•’", - "๐Ÿ•‘", - "๐Ÿ•" - ], interval: 100}, - Spinners::Aesthetic => SpinnerFrames {frames: vec![ - "โ–ฐโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑ", - "โ–ฐโ–ฐโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑ", - "โ–ฐโ–ฐโ–ฐโ–ฑโ–ฑโ–ฑโ–ฑ", - "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฑโ–ฑโ–ฑ", - "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฑโ–ฑ", - "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฑ", - "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฐ", - "โ–ฐโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑ" - ], interval: 80}, - Spinners::Binary => SpinnerFrames {frames: vec![ - "010010", - "001100", - "100101", - "111010", - "111101", - "010111", - ], interval: 50}, - Spinners::Cute => SpinnerFrames {frames: vec![ - "( ยด๏ฝฅฯ‰๏ฝฅ)", - "(ใ€€ยด๏ฝฅฯ‰)", - "( ใ€€ยด๏ฝฅ)", - "( ใ€€ ยด)", - "( )", - "(`ใ€€ )", - "(๏ฝฅ` )", - "(ฯ‰๏ฝฅ`ใ€€)", - "(๏ฝฅฯ‰๏ฝฅ` )", - "(ยด๏ฝฅฯ‰๏ฝฅ`)", - ], interval: 100}, - } -}); diff --git a/src/spinner_enum.rs b/src/spinner_enum.rs deleted file mode 100644 index 081ef89..0000000 --- a/src/spinner_enum.rs +++ /dev/null @@ -1,100 +0,0 @@ -use strum::EnumIter; - -/// An enum of all the available spinners. -/// -/// Contains around 80+ spinners. -/// It is recommended to use the `all_spinners` example to view each spinner's animation. -/// -/// ```ignore -/// cargo run --example all_spinners -/// ``` -/// -/// Each variant in this enum is assigned to a `HashMap` holding it's frames and interval count. -/// -#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, EnumIter, strum::Display)] -pub enum Spinners { - Aesthetic, - Arc, - Arrow, - Arrow2, - Arrow3, - Balloon, - Balloon2, - BetaWave, - BluePulse, - Bounce, - BouncingBall, - BouncingBar, - BoxBounce, - BoxBounce2, - Binary, - Christmas, - Circle, - CircleHalves, - CircleQuarters, - Clock, - Cute, - Dots, - Dots10, - Dots11, - Dots12, - Dots2, - Dots3, - Dots4, - Dots5, - Dots6, - Dots7, - Dots8, - Dots8Bit, - Dots9, - Dqpb, - Earth, - FingerDance, - FistBump, - Flip, - Grenade, - GrowHorizontal, - GrowVertical, - Hamburger, - Hearts, - Layer, - Line, - Line2, - Material, - Mindblown, - Monkey, - Moon, - Noise, - OrangeBluePulse, - OrangePulse, - Pipe, - Point, - Pong, - Runner, - Shark, - SimpleDots, - SimpleDotsScrolling, - Smiley, - SoccerHeader, - Speaker, - SquareCorners, - Squish, - Star, - Star2, - TimeTravel, - Toggle, - Toggle10, - Toggle11, - Toggle12, - Toggle13, - Toggle2, - Toggle3, - Toggle4, - Toggle5, - Toggle6, - Toggle7, - Toggle8, - Toggle9, - Triangle, - Weather, -} diff --git a/src/spinners.rs b/src/spinners.rs new file mode 100644 index 0000000..29a6dac --- /dev/null +++ b/src/spinners.rs @@ -0,0 +1,593 @@ +#[allow(unused_imports)] +use once_cell::sync::Lazy; +use paste::paste; + +/// A Struct that contains the data for a spinner. +/// Frames is a Vec of &str, each &str is a frame of the spinner. +/// Interval is the number of milliseconds to wait before moving to the next frame. +#[derive(Debug, Clone)] +pub struct SpinnerFrames { + pub frames: Vec<&'static str>, + pub interval: u16, +} + +macro_rules! spinner_frames { + ( $name:expr, [ $( $frame:expr ),* ], $interval:expr ) => { + paste! { + #[cfg(feature = $name)] + pub struct [< $name:camel >]; + + #[cfg(feature = $name)] + impl From<[< $name:camel >]> for SpinnerFrames { + fn from(_: [< $name:camel >]) -> SpinnerFrames { + #[cfg(feature = $name)] + [< $name:upper >].clone() + } + } + + #[cfg(feature = $name)] + static [< $name:upper >]: Lazy + = Lazy::new(|| SpinnerFrames { + interval: $interval, + frames: vec![$($frame),*] + }); + } + }; +} + +spinner_frames!( + "dots", + ["โ ‹", "โ ™", "โ น", "โ ธ", "โ ผ", "โ ด", "โ ฆ", "โ ง", "โ ‡", "โ "], + 80 +); + +spinner_frames!("dots2", ["โฃพ", "โฃฝ", "โฃป", "โขฟ", "โกฟ", "โฃŸ", "โฃฏ", "โฃท"], 80); + +spinner_frames!( + "dots3", + ["โ ‹", "โ ™", "โ š", "โ ž", "โ –", "โ ฆ", "โ ด", "โ ฒ", "โ ณ", "โ “"], + 80 +); + +spinner_frames!( + "dots4", + [ + "โ „", "โ †", "โ ‡", "โ ‹", "โ ™", "โ ธ", "โ ฐ", "โ  ", "โ ฐ", "โ ธ", "โ ™", "โ ‹", "โ ‡", "โ †" + ], + 80 +); + +spinner_frames!( + "dots5", + [ + "โ ‹", "โ ™", "โ š", "โ ’", "โ ‚", "โ ‚", "โ ’", "โ ฒ", "โ ด", "โ ฆ", "โ –", "โ ’", "โ ", "โ ", "โ ’", "โ “", "โ ‹" + ], + 80 +); + +spinner_frames!( + "dots6", + [ + "โ ", "โ ‰", "โ ™", "โ š", "โ ’", "โ ‚", "โ ‚", "โ ’", "โ ฒ", "โ ด", "โ ค", "โ „", "โ „", "โ ค", "โ ด", "โ ฒ", "โ ’", "โ ‚", + "โ ‚", "โ ’", "โ š", "โ ™", "โ ‰", "โ " + ], + 80 +); + +spinner_frames!( + "dots7", + [ + "โ ˆ", "โ ‰", "โ ‹", "โ “", "โ ’", "โ ", "โ ", "โ ’", "โ –", "โ ฆ", "โ ค", "โ  ", "โ  ", "โ ค", "โ ฆ", "โ –", "โ ’", "โ ", + "โ ", "โ ’", "โ “", "โ ‹", "โ ‰", "โ ˆ" + ], + 80 +); +spinner_frames!( + "dots8", + [ + "โ ", "โ ", "โ ‰", "โ ™", "โ š", "โ ’", "โ ‚", "โ ‚", "โ ’", "โ ฒ", "โ ด", "โ ค", "โ „", "โ „", "โ ค", "โ  ", "โ  ", "โ ค", + "โ ฆ", "โ –", "โ ’", "โ ", "โ ", "โ ’", "โ “", "โ ‹", "โ ‰", "โ ˆ", "โ ˆ" + ], + 80 +); +spinner_frames!("dots9", ["โขน", "โขบ", "โขผ", "โฃธ", "โฃ‡", "โกง", "โก—", "โก"], 80); +spinner_frames!("dots10", ["โข„", "โข‚", "โข", "โก", "โกˆ", "โก", "โก "], 80); +spinner_frames!("dots11", ["โ ", "โ ‚", "โ „", "โก€", "โข€", "โ  ", "โ ", "โ ˆ"], 80); +spinner_frames!( + "dots12", + [ + "โข€โ €", "โก€โ €", "โ „โ €", "โข‚โ €", "โก‚โ €", "โ …โ €", "โขƒโ €", "โกƒโ €", "โ โ €", "โข‹โ €", "โก‹โ €", "โ โ ", "โข‹โ ", "โก‹โ ", "โ โ ‰", + "โ ‹โ ‰", "โ ‹โ ‰", "โ ‰โ ™", "โ ‰โ ™", "โ ‰โ ฉ", "โ ˆโข™", "โ ˆโก™", "โขˆโ ฉ", "โก€โข™", "โ „โก™", "โข‚โ ฉ", "โก‚โข˜", "โ …โก˜", "โขƒโ จ", "โกƒโข", + "โ โก", "โข‹โ  ", "โก‹โข€", "โ โก", "โข‹โ ", "โก‹โ ", "โ โ ‰", "โ ‹โ ‰", "โ ‹โ ‰", "โ ‰โ ™", "โ ‰โ ™", "โ ‰โ ฉ", "โ ˆโข™", "โ ˆโก™", "โ ˆโ ฉ", + "โ €โข™", "โ €โก™", "โ €โ ฉ", "โ €โข˜", "โ €โก˜", "โ €โ จ", "โ €โข", "โ €โก", "โ €โ  ", "โ €โข€", "โ €โก€" + ], + 80 +); +spinner_frames!( + "dots8bit", + [ + "โ €", "โ ", "โ ‚", "โ ƒ", "โ „", "โ …", "โ †", "โ ‡", "โก€", "โก", "โก‚", "โกƒ", "โก„", "โก…", "โก†", "โก‡", "โ ˆ", "โ ‰", + "โ Š", "โ ‹", "โ Œ", "โ ", "โ Ž", "โ ", "โกˆ", "โก‰", "โกŠ", "โก‹", "โกŒ", "โก", "โกŽ", "โก", "โ ", "โ ‘", "โ ’", "โ “", + "โ ”", "โ •", "โ –", "โ —", "โก", "โก‘", "โก’", "โก“", "โก”", "โก•", "โก–", "โก—", "โ ˜", "โ ™", "โ š", "โ ›", "โ œ", "โ ", + "โ ž", "โ Ÿ", "โก˜", "โก™", "โกš", "โก›", "โกœ", "โก", "โกž", "โกŸ", "โ  ", "โ ก", "โ ข", "โ ฃ", "โ ค", "โ ฅ", "โ ฆ", "โ ง", + "โก ", "โกก", "โกข", "โกฃ", "โกค", "โกฅ", "โกฆ", "โกง", "โ จ", "โ ฉ", "โ ช", "โ ซ", "โ ฌ", "โ ญ", "โ ฎ", "โ ฏ", "โกจ", "โกฉ", + "โกช", "โกซ", "โกฌ", "โกญ", "โกฎ", "โกฏ", "โ ฐ", "โ ฑ", "โ ฒ", "โ ณ", "โ ด", "โ ต", "โ ถ", "โ ท", "โกฐ", "โกฑ", "โกฒ", "โกณ", + "โกด", "โกต", "โกถ", "โกท", "โ ธ", "โ น", "โ บ", "โ ป", "โ ผ", "โ ฝ", "โ พ", "โ ฟ", "โกธ", "โกน", "โกบ", "โกป", "โกผ", "โกฝ", + "โกพ", "โกฟ", "โข€", "โข", "โข‚", "โขƒ", "โข„", "โข…", "โข†", "โข‡", "โฃ€", "โฃ", "โฃ‚", "โฃƒ", "โฃ„", "โฃ…", "โฃ†", "โฃ‡", + "โขˆ", "โข‰", "โขŠ", "โข‹", "โขŒ", "โข", "โขŽ", "โข", "โฃˆ", "โฃ‰", "โฃŠ", "โฃ‹", "โฃŒ", "โฃ", "โฃŽ", "โฃ", "โข", "โข‘", + "โข’", "โข“", "โข”", "โข•", "โข–", "โข—", "โฃ", "โฃ‘", "โฃ’", "โฃ“", "โฃ”", "โฃ•", "โฃ–", "โฃ—", "โข˜", "โข™", "โขš", "โข›", + "โขœ", "โข", "โขž", "โขŸ", "โฃ˜", "โฃ™", "โฃš", "โฃ›", "โฃœ", "โฃ", "โฃž", "โฃŸ", "โข ", "โขก", "โขข", "โขฃ", "โขค", "โขฅ", + "โขฆ", "โขง", "โฃ ", "โฃก", "โฃข", "โฃฃ", "โฃค", "โฃฅ", "โฃฆ", "โฃง", "โขจ", "โขฉ", "โขช", "โขซ", "โขฌ", "โขญ", "โขฎ", "โขฏ", + "โฃจ", "โฃฉ", "โฃช", "โฃซ", "โฃฌ", "โฃญ", "โฃฎ", "โฃฏ", "โขฐ", "โขฑ", "โขฒ", "โขณ", "โขด", "โขต", "โขถ", "โขท", "โฃฐ", "โฃฑ", + "โฃฒ", "โฃณ", "โฃด", "โฃต", "โฃถ", "โฃท", "โขธ", "โขน", "โขบ", "โขป", "โขผ", "โขฝ", "โขพ", "โขฟ", "โฃธ", "โฃน", "โฃบ", "โฃป", + "โฃผ", "โฃฝ", "โฃพ", "โฃฟ" + ], + 80 +); + +spinner_frames!("line", ["-", "\\", "|", "/"], 130); + +spinner_frames!("line2", ["โ ‚", "-", "โ€“", "โ€”", "โ€“", "-"], 100); + +spinner_frames!("pipe", ["โ”ค", "โ”˜", "โ”ด", "โ””", "โ”œ", "โ”Œ", "โ”ฌ", "โ”"], 100); + +spinner_frames!("simple_dots", [". ", ".. ", "...", " "], 400); + +spinner_frames!( + "simple_dots_scrolling", + [". ", ".. ", "...", " ..", " .", " "], + 200 +); + +spinner_frames!("star", ["โœถ", "โœธ", "โœน", "โœบ", "โœน", "โœท"], 70); + +spinner_frames!("star2", ["+", "x", "*"], 80); + +spinner_frames!( + "flip", + ["_", "_", "_", "-", "`", "`", "'", "ยด", "-", "_", "_", "_"], + 70 +); + +spinner_frames!("hamburger", ["โ˜ฑ", "โ˜ฒ", "โ˜ด"], 100); + +spinner_frames!( + "grow_vertical", + ["โ–", "โ–ƒ", "โ–„", "โ–…", "โ–†", "โ–‡", "โ–†", "โ–…", "โ–„", "โ–ƒ"], + 120 +); + +spinner_frames!( + "grow_horizontal", + ["โ–", "โ–Ž", "โ–", "โ–Œ", "โ–‹", "โ–Š", "โ–‰", "โ–Š", "โ–‹", "โ–Œ", "โ–", "โ–Ž"], + 120 +); + +spinner_frames!("balloon", [" ", ".", "o", "O", "@", "*", " "], 140); + +spinner_frames!("balloon2", [".", "o", "O", "ยฐ", "O", "o", "."], 120); + +spinner_frames!("noise", ["โ–“", "โ–’", "โ–‘"], 100); + +spinner_frames!("bounce", ["โ ", "โ ‚", "โ „", "โ ‚"], 120); + +spinner_frames!("box_bounce", ["โ––", "โ–˜", "โ–", "โ–—"], 120); + +spinner_frames!("box_bounce2", ["โ–Œ", "โ–€", "โ–", "โ–„"], 100); + +spinner_frames!("triangle", ["โ—ข", "โ—ฃ", "โ—ค", "โ—ฅ"], 50); + +spinner_frames!("arc", ["โ—œ", "โ— ", "โ—", "โ—ž", "โ—ก", "โ—Ÿ"], 100); + +spinner_frames!("circle", ["โ—ก", "โŠ™", "โ— "], 120); + +spinner_frames!("square_corners", ["โ—ฐ", "โ—ณ", "โ—ฒ", "โ—ฑ"], 180); + +spinner_frames!("circle_quarters", ["โ—ด", "โ—ท", "โ—ถ", "โ—ต"], 120); + +spinner_frames!("circle_halves", ["โ—", "โ—“", "โ—‘", "โ—’"], 50); + +spinner_frames!("squish", ["โ•ซ", "โ•ช"], 100); + +spinner_frames!("toggle", ["โŠถ", "โŠท"], 250); + +spinner_frames!("toggle2", ["โ–ซ", "โ–ช"], 80); + +spinner_frames!("toggle3", ["โ–ก", "โ– "], 120); + +spinner_frames!("toggle4", ["โ– ", "โ–ก", "โ–ช", "โ–ซ"], 100); + +spinner_frames!("toggle5", ["โ–ฎ", "โ–ฏ"], 100); + +spinner_frames!("toggle6", ["แ€", "แ€"], 300); + +spinner_frames!("toggle7", ["โฆพ", "โฆฟ"], 80); + +spinner_frames!("toggle8", ["โ—", "โ—Œ"], 100); + +spinner_frames!("toggle9", ["โ—‰", "โ—Ž"], 100); + +spinner_frames!("toggle10", ["ใŠ‚", "ใŠ€", "ใŠ"], 100); + +spinner_frames!("toggle11", ["โง‡", "โง†"], 50); + +spinner_frames!("toggle12", ["โ˜—", "โ˜–"], 120); + +spinner_frames!("toggle13", ["=", "*", "-"], 80); + +spinner_frames!("arrow", ["โ†", "โ†–", "โ†‘", "โ†—", "โ†’", "โ†˜", "โ†“", "โ†™"], 100); + +spinner_frames!( + "arrow2", + ["โฌ†๏ธ ", "โ†—๏ธ ", "โžก๏ธ ", "โ†˜๏ธ ", "โฌ‡๏ธ ", "โ†™๏ธ ", "โฌ…๏ธ ", "โ†–๏ธ "], + 80 +); + +spinner_frames!( + "arrow3", + ["โ–นโ–นโ–นโ–นโ–น", "โ–ธโ–นโ–นโ–นโ–น", "โ–นโ–ธโ–นโ–นโ–น", "โ–นโ–นโ–ธโ–นโ–น", "โ–นโ–นโ–นโ–ธโ–น", "โ–นโ–นโ–นโ–นโ–ธ"], + 120 +); + +spinner_frames!( + "bouncing_bar", + [ + "[ ]", "[= ]", "[== ]", "[=== ]", "[ ===]", "[ ==]", "[ =]", "[ ]", "[ =]", + "[ ==]", "[ ===]", "[====]", "[=== ]", "[== ]", "[= ]" + ], + 80 +); + +spinner_frames!( + "bouncing_ball", + [ + "( โ— )", + "( โ— )", + "( โ— )", + "( โ— )", + "( โ—)", + "( โ— )", + "( โ— )", + "( โ— )", + "( โ— )", + "(โ— )" + ], + 80 +); + +spinner_frames!("smiley", ["๐Ÿ˜„ ", "๐Ÿ˜ "], 200); + +spinner_frames!("monkey", ["๐Ÿ™ˆ ", "๐Ÿ™ˆ ", "๐Ÿ™‰ ", "๐Ÿ™Š "], 300); + +spinner_frames!("hearts", ["๐Ÿ’› ", "๐Ÿ’™ ", "๐Ÿ’œ ", "๐Ÿ’š ", "โค๏ธ "], 100); + +spinner_frames!( + "clock", + ["๐Ÿ•› ", "๐Ÿ• ", "๐Ÿ•‘ ", "๐Ÿ•’ ", "๐Ÿ•“ ", "๐Ÿ•” ", "๐Ÿ•• "], + 100 +); + +spinner_frames!( + "material", + [ + "โ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", + "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", + "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", + "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", + "โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–", + "โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", + "โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", + "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", + "โ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", + "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", + "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", + "โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–", + "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–" + ], + 17 +); + +spinner_frames!("earth", ["๐ŸŒ ", "๐ŸŒŽ ", "๐ŸŒ "], 180); + +spinner_frames!( + "moon", + ["๐ŸŒ‘ ", "๐ŸŒ’ ", "๐ŸŒ“ ", "๐ŸŒ” ", "๐ŸŒ• ", "๐ŸŒ– ", "๐ŸŒ— ", "๐ŸŒ˜ "], + 80 +); + +spinner_frames!("runner", ["๐Ÿšถ ", "๐Ÿƒ "], 140); + +spinner_frames!( + "pong", + [ + "โ–โ ‚ โ–Œ", + "โ–โ ˆ โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ   โ–Œ", + "โ– โก€ โ–Œ", + "โ– โ   โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ ˆ โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ   โ–Œ", + "โ– โก€ โ–Œ", + "โ– โ   โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ ˆ โ–Œ", + "โ– โ ‚โ–Œ", + "โ– โ  โ–Œ", + "โ– โก€โ–Œ", + "โ– โ   โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ ˆ โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ   โ–Œ", + "โ– โก€ โ–Œ", + "โ– โ   โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ ˆ โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ   โ–Œ", + "โ– โก€ โ–Œ", + "โ–โ   โ–Œ" + ], + 80 +); + +spinner_frames!( + "shark", + [ + "โ–|\\____________โ–Œ", + "โ–_|\\___________โ–Œ", + "โ–__|\\__________โ–Œ", + "โ–___|\\_________โ–Œ", + "โ–____|\\________โ–Œ", + "โ–_____|\\_______โ–Œ", + "โ–______|\\______โ–Œ", + "โ–_______|\\_____โ–Œ", + "โ–________|\\____โ–Œ", + "โ–_________|\\___โ–Œ", + "โ–__________|\\__โ–Œ", + "โ–___________|\\_โ–Œ", + "โ–____________|\\โ–Œ", + "โ–____________/|โ–Œ", + "โ–___________/|_โ–Œ", + "โ–__________/|__โ–Œ", + "โ–_________/|___โ–Œ", + "โ–________/|____โ–Œ", + "โ–_______/|_____โ–Œ", + "โ–______/|______โ–Œ", + "โ–_____/|_______โ–Œ", + "โ–____/|________โ–Œ", + "โ–___/|_________โ–Œ", + "โ–__/|__________โ–Œ", + "โ–_/|___________โ–Œ", + "โ–/|____________โ–Œ" + ], + 120 +); + +spinner_frames!("dqpb", ["d", "q", "p", "b"], 100); + +spinner_frames!( + "weather", + [ + "โ˜€๏ธ ", "โ˜€๏ธ ", "โ˜€๏ธ ", "๐ŸŒค ", "โ›…๏ธ ", "๐ŸŒฅ ", "โ˜๏ธ ", "๐ŸŒง ", "๐ŸŒจ ", "๐ŸŒง ", "๐ŸŒจ ", "๐ŸŒง ", "๐ŸŒจ ", "โ›ˆ ", "๐ŸŒจ ", + "๐ŸŒง ", "๐ŸŒจ ", "โ˜๏ธ ", "๐ŸŒฅ ", "โ›…๏ธ ", "๐ŸŒค ", "โ˜€๏ธ ", "โ˜€๏ธ " + ], + 100 +); + +spinner_frames!("christmas", ["๐ŸŒฒ", "๐ŸŽ„"], 400); + +spinner_frames!( + "grenade", + [ + "ุŒ ", "โ€ฒ ", " ยด ", " โ€พ ", " โธŒ", " โธŠ", " |", " โŽ", " โ•", " เทด ", " โ“", " ", " ", + " " + ], + 80 +); + +spinner_frames!("point", ["โˆ™โˆ™โˆ™", "โ—โˆ™โˆ™", "โˆ™โ—โˆ™", "โˆ™โˆ™โ—", "โˆ™โˆ™โˆ™"], 125); + +spinner_frames!("layer", ["-", "=", "โ‰ก"], 150); + +spinner_frames!( + "beta_wave", + [ + "ฯฮฒฮฒฮฒฮฒฮฒฮฒ", + "ฮฒฯฮฒฮฒฮฒฮฒฮฒ", + "ฮฒฮฒฯฮฒฮฒฮฒฮฒ", + "ฮฒฮฒฮฒฯฮฒฮฒฮฒ", + "ฮฒฮฒฮฒฮฒฯฮฒฮฒ", + "ฮฒฮฒฮฒฮฒฮฒฯฮฒ", + "ฮฒฮฒฮฒฮฒฮฒฮฒฯ" + ], + 80 +); + +spinner_frames!( + "finger_dance", + ["๐Ÿค˜ ", "๐ŸคŸ ", "๐Ÿ–– ", "โœ‹ ", "๐Ÿคš ", "๐Ÿ‘† "], + 160 +); + +spinner_frames!( + "fist_bump", + [ + "๐Ÿคœใ€€ใ€€ใ€€ใ€€๐Ÿค› ", + "๐Ÿคœใ€€ใ€€ใ€€ใ€€๐Ÿค› ", + "๐Ÿคœใ€€ใ€€ใ€€ใ€€๐Ÿค› ", + "ใ€€๐Ÿคœใ€€ใ€€๐Ÿค›ใ€€ ", + "ใ€€ใ€€๐Ÿคœ๐Ÿค›ใ€€ใ€€ ", + "ใ€€๐Ÿคœโœจ๐Ÿค›ใ€€ใ€€ ", + "๐Ÿคœใ€€โœจใ€€๐Ÿค›ใ€€ " + ], + 80 +); + +spinner_frames!( + "soccer_header", + [ + " ๐Ÿง‘โšฝ๏ธ ๐Ÿง‘ ", + "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", + "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", + "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", + "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", + "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", + "๐Ÿง‘ โšฝ๏ธ๐Ÿง‘ ", + "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", + "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", + "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", + "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ ", + "๐Ÿง‘ โšฝ๏ธ ๐Ÿง‘ " + ], + 80 +); + +spinner_frames!( + "mindblown", + [ + "๐Ÿ˜ ", "๐Ÿ˜ ", "๐Ÿ˜ฎ ", "๐Ÿ˜ฎ ", "๐Ÿ˜ฆ ", "๐Ÿ˜ฆ ", "๐Ÿ˜ง ", "๐Ÿ˜ง ", "๐Ÿคฏ ", "๐Ÿ’ฅ ", "โœจ ", "ใ€€ ", "ใ€€ ", + "ใ€€ " + ], + 160 +); + +spinner_frames!("speaker", ["๐Ÿ”ˆ ", "๐Ÿ”‰ ", "๐Ÿ”Š ", "๐Ÿ”‰ "], 160); + +spinner_frames!("orange_pulse", ["๐Ÿ”ธ ", "๐Ÿ”ถ ", "๐ŸŸ  ", "๐ŸŸ  ", "๐Ÿ”ถ "], 100); + +spinner_frames!("blue_pulse", ["๐Ÿ”น ", "๐Ÿ”ท ", "๐Ÿ”ต ", "๐Ÿ”ต ", "๐Ÿ”ท "], 100); + +spinner_frames!( + "orange_blue_pulse", + ["๐Ÿ”ธ ", "๐Ÿ”ถ ", "๐ŸŸ  ", "๐ŸŸ  ", "๐Ÿ”ถ ", "๐Ÿ”น ", "๐Ÿ”ท ", "๐Ÿ”ต ", "๐Ÿ”ต ", "๐Ÿ”ท "], + 100 +); + +spinner_frames!( + "time_travel", + [ + "๐Ÿ•› ", "๐Ÿ•š ", "๐Ÿ•™ ", "๐Ÿ•˜ ", "๐Ÿ•— ", "๐Ÿ•– ", "๐Ÿ•• ", "๐Ÿ•” ", "๐Ÿ•“ ", "๐Ÿ•’ ", "๐Ÿ•‘ ", "๐Ÿ• " + ], + 100 +); + +spinner_frames!( + "aesthetic", + [ + "โ–ฐโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑ", + "โ–ฐโ–ฐโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑ", + "โ–ฐโ–ฐโ–ฐโ–ฑโ–ฑโ–ฑโ–ฑ", + "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฑโ–ฑโ–ฑ", + "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฑโ–ฑ", + "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฑ", + "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฐ", + "โ–ฐโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑ" + ], + 80 +); + +spinner_frames!( + "binary", + ["010010", "001100", "100101", "111010", "111101", "010111"], + 50 +); + +spinner_frames!( + "cute", + [ + "( ยด๏ฝฅฯ‰๏ฝฅ)", + "(ใ€€ยด๏ฝฅฯ‰)", + "( ใ€€ยด๏ฝฅ)", + "( ใ€€ ยด)", + "( )", + "(`ใ€€ )", + "(๏ฝฅ` )", + "(ฯ‰๏ฝฅ`ใ€€)", + "(๏ฝฅฯ‰๏ฝฅ` )", + "(ยด๏ฝฅฯ‰๏ฝฅ`)" + ], + 100 +);