#[macro_export]
macro_rules! span {
($string:literal) => {
$crate::ratatui_core::text::Span::raw($crate::format!($string))
};
($string:literal, $($arg:tt)*) => {
$crate::ratatui_core::text::Span::raw($crate::format!($string, $($arg)*))
};
($expr:expr) => {
$crate::ratatui_core::text::Span::raw($crate::format!("{}", $expr))
};
($style:expr, $($arg:tt)*) => {
compile_error!("first parameter must be a formatting specifier followed by a comma OR a `Style` followed by a semicolon")
};
($style:expr; $string:literal) => {
$crate::ratatui_core::text::Span::styled($crate::format!($string), $style)
};
($style:expr; $string:literal, $($arg:tt)*) => {
$crate::ratatui_core::text::Span::styled($crate::format!($string, $($arg)*), $style)
};
($style:expr; $expr:expr) => {
$crate::ratatui_core::text::Span::styled($crate::format!("{}", $expr), $style)
};
}
#[cfg(test)]
mod tests {
use ratatui_core::{
style::{Color, Modifier, Style},
text::Span,
};
#[test]
fn raw() {
let test = "test";
let content = "content";
let number = 123;
let span = span!("test content");
assert_eq!(span, Span::raw("test content"));
let span = span!("test {}", "content");
assert_eq!(span, Span::raw("test content"));
let span = span!("test {}", content);
assert_eq!(span, Span::raw("test content"));
let span = span!("test {content}");
assert_eq!(span, Span::raw("test content"));
let span = span!("test {content}", content = "content");
assert_eq!(span, Span::raw("test content"));
let span = span!("test {content}", content = content);
assert_eq!(span, Span::raw("test content"));
let span = span!("{} {}", "test", "content");
assert_eq!(span, Span::raw("test content"));
let span = span!("{test} {content}");
assert_eq!(span, Span::raw("test content"));
let span = span!("test {number}");
assert_eq!(span, Span::raw("test 123"));
let span = span!("test {number:04}");
assert_eq!(span, Span::raw("test 0123"));
let span = span!(number);
assert_eq!(span, Span::raw("123"));
let span = span!(test);
assert_eq!(span, Span::raw("test"));
}
#[test]
fn styled() {
const STYLE: Style = Style::new().fg(Color::Green);
let test = "test";
let content = "content";
let number = 123;
let span = span!(STYLE; "test content");
assert_eq!(span, Span::styled("test content", STYLE));
let span = span!(STYLE; "test {}", "content");
assert_eq!(span, Span::styled("test content", STYLE));
let span = span!(STYLE; "test {}", content);
assert_eq!(span, Span::styled("test content", STYLE));
let span = span!(STYLE; "test {content}");
assert_eq!(span, Span::styled("test content", STYLE));
let span = span!(STYLE; "test {content}", content = "content");
assert_eq!(span, Span::styled("test content", STYLE));
let span = span!(STYLE; "test {content}", content = content);
assert_eq!(span, Span::styled("test content", STYLE));
let span = span!(STYLE; "{} {}", "test", "content");
assert_eq!(span, Span::styled("test content", STYLE));
let span = span!(STYLE; "{test} {content}");
assert_eq!(span, Span::styled("test content", STYLE));
let span = span!(STYLE; "test {number}");
assert_eq!(span, Span::styled("test 123", STYLE));
let span = span!(STYLE; "test {number:04}");
assert_eq!(span, Span::styled("test 0123", STYLE));
let span = span!(Color::Green; "test {content}");
assert_eq!(span, Span::styled("test content", STYLE));
let span = span!(Modifier::BOLD; "test {content}");
assert_eq!(span, Span::styled("test content", Style::new().bold()));
let span = span!(STYLE; number);
assert_eq!(span, Span::styled("123", STYLE));
let span = span!(STYLE; test);
assert_eq!(span, Span::styled("test", STYLE));
}
}