use super::LoadedWorld;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Provenance {
Authored,
AuthoredShadowing {
generated_by: String,
},
Injected {
by: String,
},
Generated {
by: String,
},
Expanded,
}
impl Provenance {
pub fn source(&self) -> Option<&str> {
match self {
Provenance::AuthoredShadowing { generated_by } => Some(generated_by),
Provenance::Injected { by } => Some(by),
Provenance::Generated { by } => Some(by),
Provenance::Authored | Provenance::Expanded => None,
}
}
pub fn is_authored(&self) -> bool {
matches!(
self,
Provenance::Authored | Provenance::AuthoredShadowing { .. }
)
}
pub fn is_overridable(&self) -> bool {
matches!(
self,
Provenance::Injected { .. } | Provenance::Generated { .. }
)
}
}
impl std::fmt::Display for Provenance {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Provenance::Authored => write!(f, "authored"),
Provenance::AuthoredShadowing { generated_by } => {
write!(f, "authored (shadows {})", generated_by)
}
Provenance::Injected { by } => write!(f, "injected:{}", by),
Provenance::Generated { by } => write!(f, "generated:{}", by),
Provenance::Expanded => write!(f, "expanded"),
}
}
}
impl LoadedWorld {
pub fn provenance(&self, name: &str) -> Provenance {
if self.authored.iter().any(|n| n == name) {
return match self.shadowed.iter().find(|s| s.name == name) {
Some(s) => Provenance::AuthoredShadowing {
generated_by: s.generated_by.clone(),
},
None => Provenance::Authored,
};
}
if let Some(i) = self.injected.iter().find(|i| i.name == name) {
return Provenance::Injected {
by: i.injected_by.to_string(),
};
}
if let Some(g) = self.generated.iter().find(|g| g.name == name) {
return Provenance::Generated {
by: g.generated_by.clone(),
};
}
Provenance::Expanded
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::build_only::{GeneratedAsset, InjectedAsset, ShadowedAsset};
fn world() -> LoadedWorld {
LoadedWorld {
assets: Vec::new(),
injected: vec![InjectedAsset {
name: "hud_font".to_string(),
asset_type: "Font".to_string(),
args: serde_json::json!({}),
injected_by: "debug_hud",
}],
generated: vec![GeneratedAsset {
name: "bistro_mat_wood".to_string(),
asset_type: "Material".to_string(),
generated_by: "bistro".to_string(),
}],
shadowed: vec![ShadowedAsset {
name: "bistro_mat_glass".to_string(),
asset_type: "Material".to_string(),
generated_by: "bistro".to_string(),
args: serde_json::json!({}),
}],
authored: vec!["cam".to_string(), "bistro_mat_glass".to_string()],
}
}
#[test]
fn each_record_classifies_its_names() {
let w = world();
assert_eq!(w.provenance("cam"), Provenance::Authored);
assert_eq!(
w.provenance("hud_font"),
Provenance::Injected {
by: "debug_hud".to_string()
}
);
assert_eq!(
w.provenance("bistro_mat_wood"),
Provenance::Generated {
by: "bistro".to_string()
}
);
assert_eq!(
w.provenance("bistro_mat_glass"),
Provenance::AuthoredShadowing {
generated_by: "bistro".to_string()
}
);
assert_eq!(w.provenance("main_menu_tab_0"), Provenance::Expanded);
}
#[test]
fn display_matches_the_listing_vocabulary() {
let w = world();
assert_eq!(w.provenance("cam").to_string(), "authored");
assert_eq!(w.provenance("hud_font").to_string(), "injected:debug_hud");
assert_eq!(
w.provenance("bistro_mat_wood").to_string(),
"generated:bistro"
);
assert_eq!(
w.provenance("bistro_mat_glass").to_string(),
"authored (shadows bistro)"
);
assert_eq!(w.provenance("nothing").to_string(), "expanded");
}
#[test]
fn source_names_the_producing_asset_or_pass() {
let w = world();
assert_eq!(w.provenance("bistro_mat_wood").source(), Some("bistro"));
assert_eq!(w.provenance("hud_font").source(), Some("debug_hud"));
assert_eq!(w.provenance("bistro_mat_glass").source(), Some("bistro"));
assert_eq!(w.provenance("cam").source(), None);
assert_eq!(w.provenance("nothing").source(), None);
}
#[test]
fn only_skipping_passes_are_overridable() {
let w = world();
assert!(w.provenance("bistro_mat_wood").is_overridable());
assert!(w.provenance("hud_font").is_overridable());
assert!(!w.provenance("nothing").is_overridable());
assert!(!w.provenance("cam").is_overridable());
assert!(!w.provenance("bistro_mat_glass").is_overridable());
}
#[test]
fn is_authored_covers_a_plain_line_and_an_overriding_copy() {
let w = world();
assert!(w.provenance("cam").is_authored());
assert!(w.provenance("bistro_mat_glass").is_authored());
assert!(!w.provenance("bistro_mat_wood").is_authored());
assert!(!w.provenance("nothing").is_authored());
}
}