viewy 2.0.1

A web UI toolkit that combine the advantages of a design system and an ui library.
use crate::node::Node;
use crate::{DefaultModifiers, Renderable};
use std::borrow::BorrowMut;
use std::fmt::Debug;
use std::ops::{Deref, DerefMut};

#[derive(Clone, Debug)]
pub enum BadgeType {
    Important,
    Normal,
}

#[derive(Clone, Debug)]
pub struct Badge {
    pub node: Node,
    pub value: Option<String>,
    pub badge_type: BadgeType,
}

impl Badge {
    pub fn new(badge_type: BadgeType, value: &str) -> Self {
        Badge {
            node: Default::default(),
            value: Some(value.to_string()),
            badge_type,
        }
    }

    pub fn textless(badge_type: BadgeType) -> Self {
        Badge {
            node: Default::default(),
            value: None,
            badge_type,
        }
    }

    pub fn remove_on_click(&mut self, id: &str) -> Self {
        self.set_attr("data-remove-on-click", id).clone()
    }
}

impl Deref for Badge {
    type Target = Node;

    fn deref(&self) -> &Self::Target {
        &self.node
    }
}

impl DerefMut for Badge {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.node
    }
}

impl DefaultModifiers for Badge {}

impl Renderable for Badge {
    fn render(mut self) -> Node {
        self.add_class("badge");
        match &self.value {
            None => self.add_class("badge--textless"),
            Some(_) => self.add_class("badge--with-text"),
        };
        match &self.badge_type {
            BadgeType::Important => self.add_class("badge--important"),
            BadgeType::Normal => self.add_class("badge--normal"),
        };
        self.node.text = self.value.clone();
        self.node
    }
}

pub trait BadgeSupport {
    fn add_badge(&mut self, badge: Badge);
}

pub trait BadgeModifiers: Sized + Clone + BadgeSupport {
    fn badge(&mut self, count: &usize) -> Self {
        if count.gt(&99) {
            self.add_badge(Badge::new(BadgeType::Important, "99+"));
        } else {
            self.add_badge(Badge::new(BadgeType::Important, &count.to_string()));
        }
        self.clone()
    }
}