pub use concinnity_asset::cook::{
CameraShot, CharacterModel, CharacterSchema, EngineDefaults, LightRig, MainMenu,
MaterialPalette, OptionSelect, Panel, Prefab, SceneImport, Slider, StoryImport,
};
pub trait BuildOnlyAsset {}
#[macro_export]
macro_rules! for_each_build_only_type {
($cb:ident) => { $crate::for_each_build_only_type!($cb,); };
($cb:ident, $($prefix:tt)*) => {
$cb! {
$($prefix)*
build_only: {
LightRig => $crate::registry::build_only::LightRig { },
MaterialPalette => $crate::registry::build_only::MaterialPalette { },
CameraShot => $crate::registry::build_only::CameraShot { },
Prefab => $crate::registry::build_only::Prefab { },
SceneImport => $crate::registry::build_only::SceneImport { },
MainMenu => $crate::registry::build_only::MainMenu { renders },
OptionSelect => $crate::registry::build_only::OptionSelect { },
Slider => $crate::registry::build_only::Slider { },
EngineDefaults => $crate::registry::build_only::EngineDefaults { },
StoryImport => $crate::registry::build_only::StoryImport { },
Panel => $crate::registry::build_only::Panel { },
CharacterSchema => $crate::registry::build_only::CharacterSchema { },
CharacterModel => $crate::registry::build_only::CharacterModel { },
},
}
};
}
macro_rules! __impl_build_only {
(build_only: { $( $variant:ident => $ty:path { $($meta:tt)* } ),+ $(,)? } $(,)?) => {
$( impl BuildOnlyAsset for $ty {} )+
};
}
crate::for_each_build_only_type!(__impl_build_only);
#[cfg(test)]
mod tests {
use super::*;
use crate::registry::{AssetOrigin, RegisteredType, ScopeResolution};
macro_rules! assert_registered_as_build_only {
(build_only: { $( $variant:ident => $ty:path { $($meta:tt)* } ),+ $(,)? } $(,)?) => {
#[test]
fn every_build_only_type_reaches_the_authoring_registry() {
let mut count = 0;
$(
let name = stringify!($variant);
let ty = RegisteredType::parse(name)
.unwrap_or_else(|| panic!("{name} is not a registered type"));
assert_eq!(ty, RegisteredType::$variant);
assert!(
RegisteredType::all().contains(&ty),
"{name} is missing from all()"
);
assert_eq!(ty.registration().origin, AssetOrigin::BuildOnly);
assert!(!ty.addable(), "{name} is not externally addable");
assert_eq!(ty.discriminant(), None, "{name} carries a blob tag");
assert_eq!(ty.scope_resolution(), ScopeResolution::Expanded);
assert!(!ty.is_resource(), "{name} is not a resource");
count += 1;
)+
let registered = RegisteredType::all()
.iter()
.filter(|t| t.registration().origin == AssetOrigin::BuildOnly)
.count();
assert_eq!(registered, count);
}
};
}
crate::for_each_build_only_type!(assert_registered_as_build_only);
fn expanded_by_the_cook<T: BuildOnlyAsset>() {}
#[test]
fn the_group_carries_its_marker() {
expanded_by_the_cook::<Prefab>();
expanded_by_the_cook::<MainMenu>();
expanded_by_the_cook::<CharacterSchema>();
}
}