pub trait ResourceKind: Send + Sync + 'static {
const NAME: &'static str;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct FileRes;
impl ResourceKind for FileRes {
const NAME: &'static str = "File";
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct DbRes;
impl ResourceKind for DbRes {
const NAME: &'static str = "Database";
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct LockRes;
impl ResourceKind for LockRes {
const NAME: &'static str = "Lock";
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct TxRes;
impl ResourceKind for TxRes {
const NAME: &'static str = "Transaction";
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct SocketRes;
impl ResourceKind for SocketRes {
const NAME: &'static str = "Socket";
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn resource_kind_names() {
assert_eq!(FileRes::NAME, "File");
assert_eq!(DbRes::NAME, "Database");
assert_eq!(LockRes::NAME, "Lock");
assert_eq!(TxRes::NAME, "Transaction");
assert_eq!(SocketRes::NAME, "Socket");
}
#[test]
fn custom_resource_kind() {
struct CustomRes;
impl ResourceKind for CustomRes {
const NAME: &'static str = "Custom";
}
assert_eq!(CustomRes::NAME, "Custom");
}
#[test]
fn resource_markers_are_zero_sized() {
assert_eq!(std::mem::size_of::<FileRes>(), 0);
assert_eq!(std::mem::size_of::<DbRes>(), 0);
assert_eq!(std::mem::size_of::<LockRes>(), 0);
assert_eq!(std::mem::size_of::<TxRes>(), 0);
assert_eq!(std::mem::size_of::<SocketRes>(), 0);
}
#[test]
fn resource_markers_implement_debug() {
let _ = format!("{:?}", FileRes);
let _ = format!("{:?}", DbRes);
let _ = format!("{:?}", LockRes);
let _ = format!("{:?}", TxRes);
let _ = format!("{:?}", SocketRes);
}
}