use yew::prelude::*;
#[derive(Properties, Clone, PartialEq, Debug)]
pub struct NavBadgeProps {
#[prop_or_default]
pub classes: Classes,
#[prop_or("primary")]
pub variant: &'static str,
#[prop_or_default]
pub pill: bool,
#[prop_or_default]
pub children: Children
}
#[function_component]
pub fn NavBadge(props: &NavBadgeProps) -> Html {
let mut classes = props.classes.clone();
classes.push("nav-badge");
if props.pill {
classes.push("nav-badge-pill");
}
classes.push(variant_class(props.variant));
html! {
<span {classes}>
{ for props.children.iter() }
</span>
}
}
const fn variant_class(variant: &str) -> &'static str {
match variant.as_bytes() {
b"success" => "nav-badge-success",
b"warning" => "nav-badge-warning",
b"danger" => "nav-badge-danger",
_ => "nav-badge-primary"
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn nav_badge_props_default() {
let props = NavBadgeProps {
classes: Classes::default(),
variant: "primary",
pill: false,
children: Children::new(vec![])
};
assert!(!props.pill);
assert_eq!(props.variant, "primary");
}
#[test]
fn nav_badge_clone() {
let props1 = NavBadgeProps {
classes: Classes::from("test"),
variant: "success",
pill: true,
children: Children::new(vec![])
};
let props2 = props1.clone();
assert_eq!(props1.variant, props2.variant);
assert_eq!(props1.pill, props2.pill);
}
#[test]
fn variant_class_maps_documented_variants() {
assert_eq!(variant_class("primary"), "nav-badge-primary");
assert_eq!(variant_class("success"), "nav-badge-success");
assert_eq!(variant_class("warning"), "nav-badge-warning");
assert_eq!(variant_class("danger"), "nav-badge-danger");
}
#[test]
fn variant_class_unknown_falls_back_to_primary() {
assert_eq!(variant_class(""), "nav-badge-primary");
assert_eq!(variant_class("unknown"), "nav-badge-primary");
assert_eq!(variant_class("PRIMARY"), "nav-badge-primary");
}
}