use core::convert::TryFrom;
use alloc::string::{String, ToString};
#[repr(transparent)]
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FileId(u64);
impl FileId {
pub fn is_special(self) -> bool {
self.0 <= 255
}
pub fn is_file(self) -> bool {
self.0 > 255
}
pub fn from_u64_unchecked(id: u64) -> Self {
FileId(id)
}
pub fn into_u64_unchecked(self) -> u64 {
self.0
}
}
impl TryFrom<u64> for FileId {
type Error = ();
fn try_from(val: u64) -> Result<Self, Self::Error> {
if val <= 255 {
Err(())
} else {
Ok(FileId(val))
}
}
}
impl TryFrom<FileId> for u64 {
type Error = ();
fn try_from(id: FileId) -> Result<Self, Self::Error> {
if id.is_special() {
Err(())
} else {
Ok(id.0)
}
}
}
#[derive(Debug, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Group {
Default,
Custom(String),
}
impl Group {
pub fn custom(group: &str) -> Group {
Group::Custom(group.to_string())
}
}
impl Default for Group {
fn default() -> Self {
Group::Default
}
}
#[derive(Debug, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Tag {
group: Group,
name: String,
}
impl Tag {
pub fn new(group: Group, name: &str) -> Tag {
Tag {
group,
name: name.to_string(),
}
}
pub fn named(name: &str) -> Tag {
Tag {
group: Group::Default,
name: name.to_string(),
}
}
pub fn group(&self) -> &Group {
&self.group
}
pub fn name(&self) -> &str {
&self.name
}
}