#[cfg(feature = "di")]
pub use allframe_macros::{domain, handler, repository, use_case};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct LayerMetadata {
pub layer_name: &'static str,
pub layer_number: u8,
pub type_name: &'static str,
}
impl LayerMetadata {
pub const fn new(layer_name: &'static str, layer_number: u8, type_name: &'static str) -> Self {
Self {
layer_name,
layer_number,
type_name,
}
}
pub fn layer_name(&self) -> &'static str {
self.layer_name
}
pub fn layer_number(&self) -> u8 {
self.layer_number
}
pub fn type_name(&self) -> &'static str {
self.type_name
}
pub fn can_depend_on(&self, other_layer: &str) -> bool {
let other_number = match other_layer {
"domain" => 1,
"repository" => 2,
"use_case" => 3,
"handler" => 4,
_ => return false,
};
self.layer_number > other_number
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_layer_metadata_creation() {
let metadata = LayerMetadata::new("domain", 1, "User");
assert_eq!(metadata.layer_name(), "domain");
assert_eq!(metadata.layer_number(), 1);
assert_eq!(metadata.type_name(), "User");
}
#[test]
fn test_can_depend_on() {
let domain = LayerMetadata::new("domain", 1, "User");
let repository = LayerMetadata::new("repository", 2, "UserRepository");
let use_case = LayerMetadata::new("use_case", 3, "GetUserUseCase");
let handler = LayerMetadata::new("handler", 4, "GetUserHandler");
assert!(!domain.can_depend_on("repository"));
assert!(!domain.can_depend_on("use_case"));
assert!(!domain.can_depend_on("handler"));
assert!(repository.can_depend_on("domain"));
assert!(!repository.can_depend_on("use_case"));
assert!(!repository.can_depend_on("handler"));
assert!(use_case.can_depend_on("domain"));
assert!(use_case.can_depend_on("repository"));
assert!(!use_case.can_depend_on("handler"));
assert!(handler.can_depend_on("domain"));
assert!(handler.can_depend_on("repository"));
assert!(handler.can_depend_on("use_case"));
}
}