use super::traits::Renderable
pub enum ToastVariant {
Success,
Error,
Warning,
Info,
}
pub enum ToastPosition {
TopRight,
TopLeft,
BottomRight,
BottomLeft,
TopCenter,
BottomCenter,
}
pub struct Toast {
message: string,
variant: ToastVariant,
position: ToastPosition,
duration: i32,
show_close: bool,
}
impl Toast {
pub fn new(message: string) -> Toast {
Toast {
message,
variant: ToastVariant::Info,
position: ToastPosition::TopRight,
duration: 3000,
show_close: true,
}
}
pub fn variant(self, variant: ToastVariant) -> Toast {
self.variant = variant
self
}
pub fn position(self, position: ToastPosition) -> Toast {
self.position = position
self
}
pub fn duration(self, duration: i32) -> Toast {
self.duration = duration
self
}
pub fn show_close(self, show: bool) -> Toast {
self.show_close = show
self
}
}
impl Renderable for Toast {
pub fn render(self) -> string {
let variant_class = match self.variant {
ToastVariant::Success => "wj-toast-success",
ToastVariant::Error => "wj-toast-error",
ToastVariant::Warning => "wj-toast-warning",
ToastVariant::Info => "wj-toast-info",
}
let position_class = match self.position {
ToastPosition::TopRight => "wj-toast-top-right",
ToastPosition::TopLeft => "wj-toast-top-left",
ToastPosition::BottomRight => "wj-toast-bottom-right",
ToastPosition::BottomLeft => "wj-toast-bottom-left",
ToastPosition::TopCenter => "wj-toast-top-center",
ToastPosition::BottomCenter => "wj-toast-bottom-center",
}
let icon = match self.variant {
ToastVariant::Success => "✓",
ToastVariant::Error => "✗",
ToastVariant::Warning => "⚠",
ToastVariant::Info => "ℹ",
}
let close_button = if self.show_close {
"<button class='wj-toast-close'>×</button>"
} else {
""
}
format!("<div class='wj-toast {} {}' data-duration='{}'>
<span class='wj-toast-icon'>{}</span>
<span class='wj-toast-message'>{}</span>
{}
</div>", variant_class, position_class, self.duration, icon, self.message, close_button)
}
}
fn main() {
let toast1 = Toast::new("Operation successful!".to_string())
.variant(ToastVariant::Success)
.position(ToastPosition::TopRight)
println!("{}", toast1.render())
let toast2 = Toast::new("Error occurred".to_string())
.variant(ToastVariant::Error)
.duration(5000)
println!("{}", toast2.render())
}