Refactored the ErrorMessage widget into a generic Message widget for enhanced reuse. Added support for testing a single indexer at a time.

This commit is contained in:
2024-02-15 11:11:10 -07:00
parent b49bfaa9c1
commit a360c83431
23 changed files with 418 additions and 78 deletions
-40
View File
@@ -1,40 +0,0 @@
use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::title_block_centered;
use ratatui::buffer::Buffer;
use ratatui::layout::{Alignment, Rect};
use ratatui::style::Stylize;
use ratatui::text::Text;
use ratatui::widgets::{Paragraph, Widget};
#[cfg(test)]
#[path = "error_message_tests.rs"]
mod error_message_tests;
pub struct ErrorMessage<'a> {
text: Text<'a>,
}
impl<'a> ErrorMessage<'a> {
pub fn new<T>(message: T) -> Self
where
T: Into<Text<'a>>,
{
ErrorMessage {
text: message.into(),
}
}
fn render_error_message(self, area: Rect, buf: &mut Buffer) {
Paragraph::new(self.text)
.failure()
.alignment(Alignment::Center)
.block(title_block_centered("Error").failure().bold())
.render(area, buf);
}
}
impl<'a> Widget for ErrorMessage<'a> {
fn render(self, area: Rect, buf: &mut Buffer) {
self.render_error_message(area, buf);
}
}
-14
View File
@@ -1,14 +0,0 @@
#[cfg(test)]
mod tests {
use crate::ui::widgets::error_message::ErrorMessage;
use pretty_assertions::assert_eq;
use ratatui::text::Text;
#[test]
fn test_error_message_new() {
let message = "This is an error message";
let error_message = ErrorMessage::new(message);
assert_eq!(error_message.text, Text::from(message));
}
}
+55
View File
@@ -0,0 +1,55 @@
use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::title_block_centered;
use ratatui::buffer::Buffer;
use ratatui::layout::{Alignment, Rect};
use ratatui::style::{Style, Stylize};
use ratatui::text::Text;
use ratatui::widgets::{Paragraph, Widget, Wrap};
#[cfg(test)]
#[path = "message_tests.rs"]
mod message_tests;
pub struct Message<'a> {
text: Text<'a>,
title: &'a str,
style: Style,
}
impl<'a> Message<'a> {
pub fn new<T>(message: T) -> Self
where
T: Into<Text<'a>>,
{
Message {
text: message.into(),
title: "Error",
style: Style::new().failure().bold(),
}
}
pub fn title(mut self, title: &'a str) -> Self {
self.title = title;
self
}
pub fn style(mut self, style: Style) -> Self {
self.style = style;
self
}
fn render_message(self, area: Rect, buf: &mut Buffer) {
Paragraph::new(self.text)
.style(self.style)
.alignment(Alignment::Center)
.block(title_block_centered(self.title).style(self.style))
.wrap(Wrap { trim: true })
.render(area, buf);
}
}
impl<'a> Widget for Message<'a> {
fn render(self, area: Rect, buf: &mut Buffer) {
self.render_message(area, buf);
}
}
+43
View File
@@ -0,0 +1,43 @@
#[cfg(test)]
mod tests {
use crate::ui::styles::ManagarrStyle;
use crate::ui::widgets::message::Message;
use pretty_assertions::{assert_eq, assert_str_eq};
use ratatui::style::{Style, Stylize};
use ratatui::text::Text;
#[test]
fn test_error_message_new() {
let test_message = "This is a message";
let message = Message::new(test_message);
assert_eq!(message.text, Text::from(test_message));
assert_str_eq!(message.title, "Error");
assert_eq!(message.style, Style::new().failure().bold());
}
#[test]
fn test_message_title() {
let test_message = "This is a message";
let title = "Success";
let message = Message::new(test_message).title(title);
assert_str_eq!(message.title, title);
assert_eq!(message.text, Text::from(test_message));
assert_eq!(message.style, Style::new().failure().bold());
}
#[test]
fn test_message_style() {
let test_message = "This is a message";
let style = Style::new().success().bold();
let message = Message::new(test_message).style(style);
assert_eq!(message.style, style);
assert_eq!(message.text, Text::from(test_message));
assert_str_eq!(message.title, "Error");
}
}
+1 -1
View File
@@ -1,9 +1,9 @@
pub(super) mod button;
pub(super) mod checkbox;
pub(super) mod confirmation_prompt;
pub(super) mod error_message;
pub(super) mod input_box;
pub(super) mod loading_block;
pub(super) mod managarr_table;
pub(super) mod message;
pub(super) mod popup;
pub(super) mod selectable_list;
+4 -2
View File
@@ -12,7 +12,8 @@ mod popup_tests;
pub enum Size {
Prompt,
LargePrompt,
Error,
Message,
LargeMessage,
InputBox,
Dropdown,
Small,
@@ -25,7 +26,8 @@ impl Size {
match self {
Size::Prompt => (35, 35),
Size::LargePrompt => (70, 45),
Size::Error => (25, 8),
Size::Message => (25, 8),
Size::LargeMessage => (25, 25),
Size::InputBox => (30, 13),
Size::Dropdown => (20, 30),
Size::Small => (40, 40),
+2 -1
View File
@@ -8,7 +8,8 @@ mod tests {
fn test_dimensions_to_percent() {
assert_eq!(Size::Prompt.to_percent(), (35, 35));
assert_eq!(Size::LargePrompt.to_percent(), (70, 45));
assert_eq!(Size::Error.to_percent(), (25, 8));
assert_eq!(Size::Message.to_percent(), (25, 8));
assert_eq!(Size::LargeMessage.to_percent(), (25, 25));
assert_eq!(Size::InputBox.to_percent(), (30, 13));
assert_eq!(Size::Dropdown.to_percent(), (20, 30));
assert_eq!(Size::Small.to_percent(), (40, 40));