rattles 0.3.1

Minimal terminal spinners for Rust
Documentation
#[macro_export]
macro_rules! rattle {
    ($ty:ident, $fn_name:ident, ($width:literal, $height:literal), $interval_ms:literal, [$($frame:literal),+ $(,)?]) => {
        $crate::rattle!(@impl $ty, $fn_name, $width, $height, $interval_ms, @inline [$($frame),+]);
    };

    ($ty:ident, $fn_name:ident, $width:literal, $interval_ms:literal, [$($frame:literal),+ $(,)?]) => {
        $crate::rattle!(@impl $ty, $fn_name, $width, 1, $interval_ms, @inline [$($frame),+]);
    };

    ($ty:ident, $fn_name:ident, ($width:literal, $height:literal), $interval_ms:literal, $frames:path) => {
        $crate::rattle!(@impl $ty, $fn_name, $width, $height, $interval_ms, @path $frames);
    };

    ($ty:ident, $fn_name:ident, $width:literal, $interval_ms:literal, $frames:path) => {
        $crate::rattle!(@impl $ty, $fn_name, $width, 1, $interval_ms, @path $frames);
    };

    (@impl $ty:ident, $fn_name:ident, $width:literal, $height:literal, $interval_ms:literal, @inline [$($frame:literal),+]) => {
        $crate::rattle!(@emit $ty, $fn_name, $width, $height, $interval_ms, &[$(&[$frame]),+], [$($frame),+]);
    };

    (@impl $ty:ident, $fn_name:ident, $width:literal, $height:literal, $interval_ms:literal, @path $frames:path) => {
        $crate::rattle!(@emit $ty, $fn_name, $width, $height, $interval_ms, $frames, $frames);
    };

    (@emit $ty:ident, $fn_name:ident, $width:literal, $height:literal, $interval_ms:literal, $frames:expr, $docs:tt) => {
        #[derive(Debug, Clone, Copy, Default)]
        pub struct $ty;

        impl $crate::Rattle for $ty {
            const SIZE: $crate::Size = $crate::Size::new($width, $height);
            const INTERVAL: core::time::Duration =
                core::time::Duration::from_millis($interval_ms);
            const FRAMES: &'static [&'static [&'static str]] = $frames;
        }

        #[doc = concat!("```rust\n", stringify!($docs), "\n```")]
        pub fn $fn_name() -> $crate::Rattler<$ty> {
            $crate::Rattler::new()
        }
    };
}