character-traits-transformative-abilities 0.1.0

A Rust crate providing a conceptual framework for defining and analyzing transformative abilities using complex attributes and domains.
Documentation
// ---------------- [ File: character-traits-transformative-abilities/src/transform_ability_profile.rs ]
crate::ix!();

#[derive(Clone, Debug, Getters, Builder, Serialize, Deserialize)]
#[builder(pattern = "owned", build_fn(skip))]
pub struct TransformAbilityProfile {

    #[getset(get = "pub")]
    core_domain: CoreTransformDomain,

    #[getset(get = "pub")]
    nuanced_attributes: BTreeSet<NuancedTransformAttribute>,

    /// Concrete descriptors that satisfy (core_domain, nuanced_attributes).
    #[getset(get = "pub")]
    #[serde(default)]
    descriptors: Vec<TransformativeAbilityDescriptor>,
}

impl TransformAbilityProfileBuilder {

    /// Completes the builder, computing descriptors via strum iteration.
    pub fn build(self) -> Result<TransformAbilityProfile, TransformAbilityProfileBuildError> {
        let core_domain = self
            .core_domain
            .ok_or(TransformAbilityProfileBuildError::MissingCoreDomain)?;

        let nuanced_attributes = self
            .nuanced_attributes
            .ok_or(TransformAbilityProfileBuildError::MissingAttributeSet)?;

        let descriptors = find_transform_descriptors_for(&core_domain, &nuanced_attributes);

        Ok(TransformAbilityProfile {
            core_domain,
            nuanced_attributes,
            descriptors,
        })
    }
}

// -----------------------------------------------------------------------------
//  Convenience conversion from a *single* descriptor.
// -----------------------------------------------------------------------------
impl From<TransformativeAbilityDescriptor> for TransformAbilityProfile {
    fn from(descriptor: TransformativeAbilityDescriptor) -> Self {
        let (core_domain, nuanced_attributes) = analyze_transformative_ability_descriptor(&descriptor);
        TransformAbilityProfile {
            core_domain,
            nuanced_attributes,
            descriptors: vec![descriptor],
        }
    }
}