use serde::ser::{Serialize, SerializeMap, Serializer};
use super::category_color::CategoryColor;
#[derive(Debug, Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Hash)]
pub struct CategoryHandle(pub(crate) u16);
impl CategoryHandle {
pub const OTHER: Self = CategoryHandle(0);
}
impl Serialize for CategoryHandle {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.0.serialize(serializer)
}
}
#[derive(Debug, Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Hash)]
pub struct SubcategoryIndex(pub u16);
impl SubcategoryIndex {
pub const OTHER: Self = SubcategoryIndex(0);
}
#[derive(Debug, Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Hash)]
pub struct CategoryPairHandle(pub(crate) CategoryHandle, pub(crate) SubcategoryIndex);
impl From<CategoryHandle> for CategoryPairHandle {
fn from(category: CategoryHandle) -> Self {
CategoryPairHandle(category, SubcategoryIndex::OTHER)
}
}
#[derive(Debug)]
pub struct InternalCategory {
name: String,
color: CategoryColor,
subcategories: Vec<String>,
}
impl InternalCategory {
pub fn new(name: String, color: CategoryColor) -> Self {
let subcategories = vec!["Other".to_string()];
Self {
name,
color,
subcategories,
}
}
pub fn add_subcategory(&mut self, subcategory_name: String) -> SubcategoryIndex {
let subcategory_index = SubcategoryIndex(u16::try_from(self.subcategories.len()).unwrap());
self.subcategories.push(subcategory_name);
subcategory_index
}
}
impl Serialize for InternalCategory {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serializer.serialize_map(None)?;
map.serialize_entry("name", &self.name)?;
map.serialize_entry("color", &self.color)?;
map.serialize_entry("subcategories", &self.subcategories)?;
map.end()
}
}
impl Serialize for SubcategoryIndex {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.0.serialize(serializer)
}
}