use crate::module::resolution::ResolvedConfiguration;
use std::sync::Arc;
#[derive(Clone, Debug)]
pub struct ModuleLayer {
configuration: Arc<ResolvedConfiguration>,
parents: Vec<Arc<ModuleLayer>>,
name: String,
}
impl ModuleLayer {
#[must_use]
pub fn new(
name: String,
configuration: ResolvedConfiguration,
parents: Vec<Arc<ModuleLayer>>,
) -> Self {
Self {
configuration: Arc::new(configuration),
parents,
name,
}
}
#[must_use]
pub fn boot(configuration: ResolvedConfiguration) -> Self {
Self::new("boot".to_string(), configuration, Vec::new())
}
#[must_use]
pub fn name(&self) -> &str {
&self.name
}
#[must_use]
pub fn configuration(&self) -> &ResolvedConfiguration {
&self.configuration
}
#[must_use]
pub fn parents(&self) -> &[Arc<ModuleLayer>] {
&self.parents
}
#[must_use]
pub fn find_module(&self, name: &str) -> Option<&crate::module::resolution::ResolvedModule> {
if let Some(module) = self.configuration.get(name) {
return Some(module);
}
for parent in &self.parents {
if let Some(module) = parent.find_module(name) {
return Some(module);
}
}
None
}
#[must_use]
pub fn find_module_for_package(&self, package: &str) -> Option<&str> {
if let Some(module) = self.configuration.find_module_for_package(package) {
return Some(module);
}
for parent in &self.parents {
if let Some(module) = parent.find_module_for_package(package) {
return Some(module);
}
}
None
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_module_layer_boot() {
let config = ResolvedConfiguration::empty();
let layer = ModuleLayer::boot(config);
assert_eq!(layer.name(), "boot");
}
}