concinnity_world/registry/
build_only.rs1pub use crate::schema::camera_shot::CameraShot;
15pub use crate::schema::character_model::CharacterModel;
16pub use crate::schema::character_schema::{
17 CharacterSchema, KeyPolarity, PanelSection, ProportionGroup, SchemaJoint, SchemaKey,
18 SchemaRegion, ShapePreset, SynthParams, SynthesizedTarget,
19};
20pub use crate::schema::engine_defaults::EngineDefaults;
21pub use crate::schema::light_rig::LightRig;
22pub use crate::schema::main_menu::{MainMenu, MainMenuItem, SettingsProfile};
23pub use crate::schema::material_palette::{MaterialPalette, PaletteEntry};
24pub use crate::schema::option_select::OptionSelect;
25pub use crate::schema::panel::Panel;
26pub use crate::schema::prefab::{Prefab, PrefabEntry, PrefabKind};
27pub use crate::schema::scene_import::SceneImport;
28pub use crate::schema::slider::Slider;
29pub use crate::schema::story_import::StoryImport;
30
31pub trait BuildOnlyAsset {}
41
42#[macro_export]
49macro_rules! for_each_build_only_type {
50 ($cb:ident) => { $crate::for_each_build_only_type!($cb,); };
51 ($cb:ident, $($prefix:tt)*) => {
52 $cb! {
53 $($prefix)*
54 build_only: {
55 LightRig => $crate::registry::build_only::LightRig { },
56 MaterialPalette => $crate::registry::build_only::MaterialPalette { },
57 CameraShot => $crate::registry::build_only::CameraShot { },
58 Prefab => $crate::registry::build_only::Prefab { },
59 SceneImport => $crate::registry::build_only::SceneImport { },
60 MainMenu => $crate::registry::build_only::MainMenu { renders },
61 OptionSelect => $crate::registry::build_only::OptionSelect { },
62 Slider => $crate::registry::build_only::Slider { },
63 EngineDefaults => $crate::registry::build_only::EngineDefaults { },
64 StoryImport => $crate::registry::build_only::StoryImport { },
65 Panel => $crate::registry::build_only::Panel { },
66 CharacterSchema => $crate::registry::build_only::CharacterSchema { },
67 CharacterModel => $crate::registry::build_only::CharacterModel { },
68 },
69 }
70 };
71}
72
73macro_rules! __impl_build_only {
76 (build_only: { $( $variant:ident => $ty:path { $($meta:tt)* } ),+ $(,)? } $(,)?) => {
77 $( impl BuildOnlyAsset for $ty {} )+
78 };
79}
80
81crate::for_each_build_only_type!(__impl_build_only);
82
83#[cfg(test)]
84mod tests {
85 use super::*;
86 use crate::registry::{AssetOrigin, RegisteredType, ScopeResolution};
87
88 macro_rules! assert_registered_as_build_only {
94 (build_only: { $( $variant:ident => $ty:path { $($meta:tt)* } ),+ $(,)? } $(,)?) => {
95 #[test]
96 fn every_build_only_type_reaches_the_authoring_registry() {
97 let mut count = 0;
98 $(
99 let name = stringify!($variant);
100 let ty = RegisteredType::parse(name)
101 .unwrap_or_else(|| panic!("{name} is not a registered type"));
102 assert_eq!(ty, RegisteredType::$variant);
103 assert!(
104 RegisteredType::all().contains(&ty),
105 "{name} is missing from all()"
106 );
107 assert_eq!(ty.registration().origin, AssetOrigin::BuildOnly);
113 assert!(!ty.addable(), "{name} is not externally addable");
114 assert_eq!(ty.discriminant(), None, "{name} carries a blob tag");
115 assert_eq!(ty.scope_resolution(), ScopeResolution::Expanded);
116 assert!(!ty.is_resource(), "{name} is not a resource");
117 count += 1;
118 )+
119 let registered = RegisteredType::all()
122 .iter()
123 .filter(|t| t.registration().origin == AssetOrigin::BuildOnly)
124 .count();
125 assert_eq!(registered, count);
126 }
127 };
128 }
129
130 crate::for_each_build_only_type!(assert_registered_as_build_only);
131
132 fn expanded_by_the_cook<T: BuildOnlyAsset>() {}
134
135 #[test]
136 fn the_group_carries_its_marker() {
137 expanded_by_the_cook::<Prefab>();
138 expanded_by_the_cook::<MainMenu>();
139 expanded_by_the_cook::<CharacterSchema>();
140 }
141}