character_traits_warrior_capability/
capability_variant.rs1crate::ix!();
3
4pub trait CapabilityVariant: Clone + Eq + std::hash::Hash + Sized {
11 fn intrinsic_ratings(&self) -> &WarriorCapabilityIntrinsicDimensionRatings;
14
15 fn all_variants() -> &'static [Self];
18}
19
20#[macro_export]
28macro_rules! impl_capability_variant {
29 ( $($ty:ty),+ $(,)? ) => {
30 $(
31 impl CapabilityVariant for $ty {
32 fn intrinsic_ratings(&self) -> &WarriorCapabilityIntrinsicDimensionRatings {
33 use std::sync::OnceLock;
34 use strum::IntoEnumIterator;
35
36 static CACHE: OnceLock<
37 Vec<WarriorCapabilityIntrinsicDimensionRatings>
38 > = OnceLock::new();
39
40 let ratings = CACHE.get_or_init(|| {
41 <$ty as IntoEnumIterator>::iter()
42 .map(|v| v.intrinsic_dimension_ratings())
43 .collect::<Vec<_>>()
44 });
45
46 &ratings[*self as usize]
48 }
49
50 fn all_variants() -> &'static [Self] {
51 use std::sync::OnceLock;
52 use strum::IntoEnumIterator;
53
54 static VARS: OnceLock<Vec<$ty>> = OnceLock::new();
55 VARS.get_or_init(|| <$ty as IntoEnumIterator>::iter().collect())
56 }
57 }
58 )+
59 };
60}
61
62impl_capability_variant!{
63 WarriorApproachCapability,
64 WarriorBraveryCapability,
65 WarriorConflictMitigationCapability,
66 WarriorCyberDefenseCapability,
67 WarriorDefensiveMagicCapability,
68 WarriorEmbodimentCapability,
69 WarriorExplorationCapability,
70 WarriorIllusionaryMagicCapability,
71 WarriorLeadershipCapability,
72 WarriorMetaCapability,
73 WarriorOffensiveMagicCapability,
74 WarriorPhysicalCapability,
75 WarriorProtectiveCapability,
76 WarriorResilienceCapability,
77 WarriorResponsivenessCapability,
78 WarriorStrategicCapability,
79 WarriorTechAdaptationCapability,
80 WarriorThreatAdaptationCapability,
81}