Skip to main content

character_traits_transformative_abilities/
transform_ability_profile.rs

1// ---------------- [ File: character-traits-transformative-abilities/src/transform_ability_profile.rs ]
2crate::ix!();
3
4#[derive(Clone, Debug, Getters, Builder, Serialize, Deserialize)]
5#[builder(pattern = "owned", build_fn(skip))]
6pub struct TransformAbilityProfile {
7
8    #[getset(get = "pub")]
9    core_domain: CoreTransformDomain,
10
11    #[getset(get = "pub")]
12    nuanced_attributes: BTreeSet<NuancedTransformAttribute>,
13
14    /// Concrete descriptors that satisfy (core_domain, nuanced_attributes).
15    #[getset(get = "pub")]
16    #[serde(default)]
17    descriptors: Vec<TransformativeAbilityDescriptor>,
18}
19
20impl TransformAbilityProfileBuilder {
21
22    /// Completes the builder, computing descriptors via strum iteration.
23    pub fn build(self) -> Result<TransformAbilityProfile, TransformAbilityProfileBuildError> {
24        let core_domain = self
25            .core_domain
26            .ok_or(TransformAbilityProfileBuildError::MissingCoreDomain)?;
27
28        let nuanced_attributes = self
29            .nuanced_attributes
30            .ok_or(TransformAbilityProfileBuildError::MissingAttributeSet)?;
31
32        let descriptors = find_transform_descriptors_for(&core_domain, &nuanced_attributes);
33
34        Ok(TransformAbilityProfile {
35            core_domain,
36            nuanced_attributes,
37            descriptors,
38        })
39    }
40}
41
42// -----------------------------------------------------------------------------
43//  Convenience conversion from a *single* descriptor.
44// -----------------------------------------------------------------------------
45impl From<TransformativeAbilityDescriptor> for TransformAbilityProfile {
46    fn from(descriptor: TransformativeAbilityDescriptor) -> Self {
47        let (core_domain, nuanced_attributes) = analyze_transformative_ability_descriptor(&descriptor);
48        TransformAbilityProfile {
49            core_domain,
50            nuanced_attributes,
51            descriptors: vec![descriptor],
52        }
53    }
54}