gistit 0.2.3

Quick and easy code snippet sharing
use std::sync::{Arc, Mutex};

use indicatif::{ProgressBar, ProgressStyle};

#[macro_export]
macro_rules! errorln {
    ($err:expr) => {{
        use console::style;

        eprintln!(
            "{}: {}",
            style("error").red().bold(),
            $err
        );
    }};

    ($msg:literal, $($rest:expr),* $(,)*) => {{
        use console::style;

        let msg = format!($msg, $($rest,)*);
        println!("{}: {}",
            style("error").red().bold(),
            msg
        );
    }};
}

#[macro_export]
macro_rules! warnln {
    ($warn:expr) => {{
        use console::style;
        use crate::fmt::PROGRESS;

        PROGRESS.println(format!( "{}: {}",
            style("warning").yellow().bold(),
            $warn
        ));
    }};

    ($msg:literal, $($rest:expr),* $(,)*) => {{
        use console::style;
        use crate::fmt::PROGRESS;

        let msg = format!($msg, $($rest,)*);
        PROGRESS.println(format!("{}: {}",
            style("warning").yellow().bold(),
            msg
        ));
    }};
}

#[macro_export]
macro_rules! progress {
    ($msg:expr) => {{
        use crate::fmt::{PROGRESS, STATUS};
        let mut status = STATUS.lock().unwrap();
        PROGRESS.set_message($msg);
        *status = Box::leak(Box::new($msg));
    }};

    ($msg:literal, $($rest:expr),* $(,)*) => {{
        use crate::fmt::{PROGRESS, STATUS};
        let mut status = STATUS.lock().unwrap();
        let msg = format!($msg, $($rest,)*);
        PROGRESS.set_message(msg.clone());
        *status = Box::leak(Box::new(msg));
    }};
}

#[macro_export]
macro_rules! updateln {
    ($msg:expr) => {{
        use console::{style, Emoji};
        use crate::fmt::PROGRESS;
        PROGRESS.println(format!("{} {}", style(Emoji("✔️ ", "> ")).green(), $msg));
    }};

    ($msg:literal, $($rest:expr),* $(,)*) => {{
        use crate::fmt::PROGRESS;
        use console::{style, Emoji};
        let msg = format!($msg, $($rest,)*);
        PROGRESS.println(format!("{} {}", style(Emoji("✔️ ", "> ")).green(), msg));
    }};
}

#[macro_export]
macro_rules! finish {
    ($msg:expr) => {{
        use crate::fmt::PROGRESS;

        PROGRESS.println(format!("{}", $msg));
        PROGRESS.finish_and_clear();
    }};
}

#[macro_export]
macro_rules! cleanln {
    ($msg:expr) => {{
        use crate::fmt::PROGRESS;

        PROGRESS.println(format!("{}", $msg));
    }};
}

#[macro_export]
macro_rules! interruptln {
    () => {{
        use crate::fmt::{PROGRESS, STATUS};
        use console::{style, Emoji};
        let status = STATUS.lock().unwrap();

        PROGRESS.println(format!("{} {}", style(Emoji("", "x ")).red(), status));
        PROGRESS.finish_and_clear();
    }};
}

lazy_static::lazy_static! {
    pub static ref PROGRESS: ProgressBar = {
        let pb = ProgressBar::new_spinner();
        pb.set_style(
        ProgressStyle::default_spinner()
            .tick_strings(&[
                "",
                "",
                "",
                "",
                "",
                "",
                "✔️",
            ])
            .template("{spinner:.blue}  {msg}"),
        );
        pb.enable_steady_tick(100);
        pb
    };

    pub static ref STATUS: Arc<Mutex<&'static str>> = Arc::new(Mutex::new(""));
}