#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum StatePath {
Hexaco(HexacoPath),
Mood(MoodPath),
Needs(NeedsPath),
SocialCognition(SocialCognitionPath),
MentalHealth(MentalHealthPath),
Disposition(DispositionPath),
PersonCharacteristics(PersonCharacteristicsPath),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
pub enum HexacoPath {
Openness,
Conscientiousness,
Extraversion,
Agreeableness,
Neuroticism,
HonestyHumility,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MoodPath {
Valence,
Arousal,
Dominance,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum NeedsPath {
Fatigue,
Stress,
Purpose,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SocialCognitionPath {
Loneliness,
PerceivedReciprocalCaring,
PerceivedLiability,
SelfHate,
PerceivedCompetence,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MentalHealthPath {
Depression,
SelfWorth,
Hopelessness,
InterpersonalHopelessness,
AcquiredCapability,
ThwartedBelongingness,
PerceivedBurdensomeness,
SuicidalDesire,
AttemptRisk,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DispositionPath {
ImpulseControl,
Empathy,
Aggression,
Grievance,
Reactance,
TrustorPropensity,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum PersonCharacteristicsPath {
CognitiveAbility,
EmotionalRegulationAssets,
SocialCapital,
MaterialSecurity,
ExperienceDiversity,
BaselineMotivation,
PersistenceTendency,
CuriosityTendency,
Resource,
Force,
}
impl HexacoPath {
#[must_use]
pub const fn all() -> [HexacoPath; 6] {
[
HexacoPath::Openness,
HexacoPath::Conscientiousness,
HexacoPath::Extraversion,
HexacoPath::Agreeableness,
HexacoPath::Neuroticism,
HexacoPath::HonestyHumility,
]
}
#[must_use]
pub const fn name(&self) -> &'static str {
match self {
HexacoPath::Openness => "Openness",
HexacoPath::Conscientiousness => "Conscientiousness",
HexacoPath::Extraversion => "Extraversion",
HexacoPath::Agreeableness => "Agreeableness",
HexacoPath::Neuroticism => "Neuroticism",
HexacoPath::HonestyHumility => "Honesty-Humility",
}
}
}
impl MoodPath {
#[must_use]
pub const fn all() -> [MoodPath; 3] {
[MoodPath::Valence, MoodPath::Arousal, MoodPath::Dominance]
}
#[must_use]
pub const fn name(&self) -> &'static str {
match self {
MoodPath::Valence => "Valence",
MoodPath::Arousal => "Arousal",
MoodPath::Dominance => "Dominance",
}
}
}
impl NeedsPath {
#[must_use]
pub const fn all() -> [NeedsPath; 3] {
[NeedsPath::Fatigue, NeedsPath::Stress, NeedsPath::Purpose]
}
#[must_use]
pub const fn name(&self) -> &'static str {
match self {
NeedsPath::Fatigue => "Fatigue",
NeedsPath::Stress => "Stress",
NeedsPath::Purpose => "Purpose",
}
}
}
impl SocialCognitionPath {
#[must_use]
pub const fn all() -> [SocialCognitionPath; 5] {
[
SocialCognitionPath::Loneliness,
SocialCognitionPath::PerceivedReciprocalCaring,
SocialCognitionPath::PerceivedLiability,
SocialCognitionPath::SelfHate,
SocialCognitionPath::PerceivedCompetence,
]
}
#[must_use]
pub const fn name(&self) -> &'static str {
match self {
SocialCognitionPath::Loneliness => "Loneliness",
SocialCognitionPath::PerceivedReciprocalCaring => "Perceived Reciprocal Caring",
SocialCognitionPath::PerceivedLiability => "Perceived Liability",
SocialCognitionPath::SelfHate => "Self Hate",
SocialCognitionPath::PerceivedCompetence => "Perceived Competence",
}
}
}
impl MentalHealthPath {
#[must_use]
pub const fn all() -> [MentalHealthPath; 9] {
[
MentalHealthPath::Depression,
MentalHealthPath::SelfWorth,
MentalHealthPath::Hopelessness,
MentalHealthPath::InterpersonalHopelessness,
MentalHealthPath::AcquiredCapability,
MentalHealthPath::ThwartedBelongingness,
MentalHealthPath::PerceivedBurdensomeness,
MentalHealthPath::SuicidalDesire,
MentalHealthPath::AttemptRisk,
]
}
#[must_use]
pub const fn name(&self) -> &'static str {
match self {
MentalHealthPath::Depression => "Depression",
MentalHealthPath::SelfWorth => "Self Worth",
MentalHealthPath::Hopelessness => "Hopelessness",
MentalHealthPath::InterpersonalHopelessness => "Interpersonal Hopelessness",
MentalHealthPath::AcquiredCapability => "Acquired Capability",
MentalHealthPath::ThwartedBelongingness => "Thwarted Belongingness",
MentalHealthPath::PerceivedBurdensomeness => "Perceived Burdensomeness",
MentalHealthPath::SuicidalDesire => "Suicidal Desire",
MentalHealthPath::AttemptRisk => "Attempt Risk",
}
}
#[must_use]
pub const fn is_computed(&self) -> bool {
matches!(
self,
MentalHealthPath::ThwartedBelongingness
| MentalHealthPath::PerceivedBurdensomeness
| MentalHealthPath::SuicidalDesire
| MentalHealthPath::AttemptRisk
)
}
}
impl DispositionPath {
#[must_use]
pub const fn all() -> [DispositionPath; 6] {
[
DispositionPath::ImpulseControl,
DispositionPath::Empathy,
DispositionPath::Aggression,
DispositionPath::Grievance,
DispositionPath::Reactance,
DispositionPath::TrustorPropensity,
]
}
#[must_use]
pub const fn name(&self) -> &'static str {
match self {
DispositionPath::ImpulseControl => "Impulse Control",
DispositionPath::Empathy => "Empathy",
DispositionPath::Aggression => "Aggression",
DispositionPath::Grievance => "Grievance",
DispositionPath::Reactance => "Reactance",
DispositionPath::TrustorPropensity => "Trustor Propensity",
}
}
}
impl PersonCharacteristicsPath {
#[must_use]
pub const fn all() -> [PersonCharacteristicsPath; 10] {
[
PersonCharacteristicsPath::CognitiveAbility,
PersonCharacteristicsPath::EmotionalRegulationAssets,
PersonCharacteristicsPath::SocialCapital,
PersonCharacteristicsPath::MaterialSecurity,
PersonCharacteristicsPath::ExperienceDiversity,
PersonCharacteristicsPath::BaselineMotivation,
PersonCharacteristicsPath::PersistenceTendency,
PersonCharacteristicsPath::CuriosityTendency,
PersonCharacteristicsPath::Resource,
PersonCharacteristicsPath::Force,
]
}
#[must_use]
pub const fn name(&self) -> &'static str {
match self {
PersonCharacteristicsPath::CognitiveAbility => "Cognitive Ability",
PersonCharacteristicsPath::EmotionalRegulationAssets => "Emotional Regulation Assets",
PersonCharacteristicsPath::SocialCapital => "Social Capital",
PersonCharacteristicsPath::MaterialSecurity => "Material Security",
PersonCharacteristicsPath::ExperienceDiversity => "Experience Diversity",
PersonCharacteristicsPath::BaselineMotivation => "Baseline Motivation",
PersonCharacteristicsPath::PersistenceTendency => "Persistence Tendency",
PersonCharacteristicsPath::CuriosityTendency => "Curiosity Tendency",
PersonCharacteristicsPath::Resource => "Resource",
PersonCharacteristicsPath::Force => "Force",
}
}
#[must_use]
pub const fn is_composite(&self) -> bool {
matches!(
self,
PersonCharacteristicsPath::Resource | PersonCharacteristicsPath::Force
)
}
}
impl std::fmt::Display for StatePath {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
StatePath::Hexaco(p) => write!(f, "Hexaco::{}", p.name()),
StatePath::Mood(p) => write!(f, "Mood::{}", p.name()),
StatePath::Needs(p) => write!(f, "Needs::{}", p.name()),
StatePath::SocialCognition(p) => write!(f, "SocialCognition::{}", p.name()),
StatePath::MentalHealth(p) => write!(f, "MentalHealth::{}", p.name()),
StatePath::Disposition(p) => write!(f, "Disposition::{}", p.name()),
StatePath::PersonCharacteristics(p) => write!(f, "PersonCharacteristics::{}", p.name()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn state_path_mood_variants_exist() {
let _ = MoodPath::Valence;
let _ = MoodPath::Arousal;
let _ = MoodPath::Dominance;
let _ = StatePath::Mood(MoodPath::Valence);
}
#[test]
fn state_path_needs_variants_exist() {
let _ = NeedsPath::Stress;
let _ = NeedsPath::Fatigue;
let _ = NeedsPath::Purpose;
let _ = StatePath::Needs(NeedsPath::Stress);
}
#[test]
fn state_path_social_cognition_variants_exist() {
let _ = SocialCognitionPath::Loneliness;
let _ = SocialCognitionPath::PerceivedReciprocalCaring;
let _ = SocialCognitionPath::PerceivedLiability;
let _ = SocialCognitionPath::SelfHate;
let _ = SocialCognitionPath::PerceivedCompetence;
let _ = StatePath::SocialCognition(SocialCognitionPath::Loneliness);
}
#[test]
fn state_path_mental_health_variants_exist() {
let _ = MentalHealthPath::Depression;
let _ = MentalHealthPath::SelfWorth;
let _ = MentalHealthPath::Hopelessness;
let _ = MentalHealthPath::InterpersonalHopelessness;
let _ = MentalHealthPath::AcquiredCapability;
let _ = MentalHealthPath::ThwartedBelongingness;
let _ = MentalHealthPath::PerceivedBurdensomeness;
let _ = MentalHealthPath::SuicidalDesire;
let _ = MentalHealthPath::AttemptRisk;
let _ = StatePath::MentalHealth(MentalHealthPath::Depression);
}
#[test]
fn hexaco_path_all() {
let all = HexacoPath::all();
assert_eq!(all.len(), 6);
}
#[test]
fn mood_path_all() {
let all = MoodPath::all();
assert_eq!(all.len(), 3);
}
#[test]
fn needs_path_all() {
let all = NeedsPath::all();
assert_eq!(all.len(), 3);
}
#[test]
fn social_cognition_path_all() {
let all = SocialCognitionPath::all();
assert_eq!(all.len(), 5);
}
#[test]
fn mental_health_path_all() {
let all = MentalHealthPath::all();
assert_eq!(all.len(), 9);
}
#[test]
fn disposition_path_all() {
let all = DispositionPath::all();
assert_eq!(all.len(), 6);
}
#[test]
fn person_characteristics_path_all() {
let all = PersonCharacteristicsPath::all();
assert_eq!(all.len(), 10);
}
#[test]
fn path_names_not_empty() {
for p in HexacoPath::all() {
assert!(!p.name().is_empty());
}
for p in MoodPath::all() {
assert!(!p.name().is_empty());
}
for p in NeedsPath::all() {
assert!(!p.name().is_empty());
}
for p in SocialCognitionPath::all() {
assert!(!p.name().is_empty());
}
for p in MentalHealthPath::all() {
assert!(!p.name().is_empty());
}
for p in DispositionPath::all() {
assert!(!p.name().is_empty());
}
for p in PersonCharacteristicsPath::all() {
assert!(!p.name().is_empty());
}
}
#[test]
fn mental_health_computed_paths() {
assert!(!MentalHealthPath::Depression.is_computed());
assert!(MentalHealthPath::ThwartedBelongingness.is_computed());
assert!(MentalHealthPath::PerceivedBurdensomeness.is_computed());
assert!(MentalHealthPath::SuicidalDesire.is_computed());
assert!(MentalHealthPath::AttemptRisk.is_computed());
}
#[test]
fn person_characteristics_composite_paths() {
assert!(!PersonCharacteristicsPath::CognitiveAbility.is_composite());
assert!(PersonCharacteristicsPath::Resource.is_composite());
assert!(PersonCharacteristicsPath::Force.is_composite());
}
#[test]
fn state_path_display() {
let path = StatePath::Mood(MoodPath::Valence);
let display = format!("{}", path);
assert!(display.contains("Mood"));
assert!(display.contains("Valence"));
}
#[test]
fn paths_are_copy() {
let p1 = MoodPath::Valence;
let p2 = p1; assert_eq!(p1, p2);
}
#[test]
fn paths_are_hashable() {
use std::collections::HashSet;
let mut set = HashSet::new();
set.insert(StatePath::Mood(MoodPath::Valence));
set.insert(StatePath::Mood(MoodPath::Valence));
assert_eq!(set.len(), 1);
set.insert(StatePath::Mood(MoodPath::Arousal));
assert_eq!(set.len(), 2);
}
#[test]
fn debug_format() {
let path = StatePath::Needs(NeedsPath::Stress);
let debug = format!("{:?}", path);
assert!(debug.contains("Needs"));
assert!(debug.contains("Stress"));
}
#[test]
fn equality() {
assert_eq!(MoodPath::Valence, MoodPath::Valence);
assert_ne!(MoodPath::Valence, MoodPath::Arousal);
assert_eq!(
StatePath::Mood(MoodPath::Valence),
StatePath::Mood(MoodPath::Valence)
);
assert_ne!(
StatePath::Mood(MoodPath::Valence),
StatePath::Mood(MoodPath::Arousal)
);
}
#[test]
fn all_state_path_display_variants() {
let paths = [
StatePath::Hexaco(HexacoPath::Openness),
StatePath::Mood(MoodPath::Arousal),
StatePath::Needs(NeedsPath::Fatigue),
StatePath::SocialCognition(SocialCognitionPath::Loneliness),
StatePath::MentalHealth(MentalHealthPath::Depression),
StatePath::Disposition(DispositionPath::Empathy),
StatePath::PersonCharacteristics(PersonCharacteristicsPath::CognitiveAbility),
];
for path in paths {
let display = format!("{}", path);
assert!(!display.is_empty());
}
}
#[test]
fn all_hexaco_names() {
for p in HexacoPath::all() {
match p {
HexacoPath::Openness => assert_eq!(p.name(), "Openness"),
HexacoPath::Conscientiousness => assert_eq!(p.name(), "Conscientiousness"),
HexacoPath::Extraversion => assert_eq!(p.name(), "Extraversion"),
HexacoPath::Agreeableness => assert_eq!(p.name(), "Agreeableness"),
HexacoPath::Neuroticism => assert_eq!(p.name(), "Neuroticism"),
HexacoPath::HonestyHumility => assert_eq!(p.name(), "Honesty-Humility"),
}
}
}
#[test]
fn all_mood_names() {
for p in MoodPath::all() {
match p {
MoodPath::Valence => assert_eq!(p.name(), "Valence"),
MoodPath::Arousal => assert_eq!(p.name(), "Arousal"),
MoodPath::Dominance => assert_eq!(p.name(), "Dominance"),
}
}
}
#[test]
fn all_needs_names() {
for p in NeedsPath::all() {
match p {
NeedsPath::Fatigue => assert_eq!(p.name(), "Fatigue"),
NeedsPath::Stress => assert_eq!(p.name(), "Stress"),
NeedsPath::Purpose => assert_eq!(p.name(), "Purpose"),
}
}
}
#[test]
fn all_social_cognition_names() {
for p in SocialCognitionPath::all() {
match p {
SocialCognitionPath::Loneliness => assert_eq!(p.name(), "Loneliness"),
SocialCognitionPath::PerceivedReciprocalCaring => {
assert_eq!(p.name(), "Perceived Reciprocal Caring")
}
SocialCognitionPath::PerceivedLiability => {
assert_eq!(p.name(), "Perceived Liability")
}
SocialCognitionPath::SelfHate => assert_eq!(p.name(), "Self Hate"),
SocialCognitionPath::PerceivedCompetence => {
assert_eq!(p.name(), "Perceived Competence")
}
}
}
}
#[test]
fn all_mental_health_names() {
for p in MentalHealthPath::all() {
match p {
MentalHealthPath::Depression => assert_eq!(p.name(), "Depression"),
MentalHealthPath::SelfWorth => assert_eq!(p.name(), "Self Worth"),
MentalHealthPath::Hopelessness => assert_eq!(p.name(), "Hopelessness"),
MentalHealthPath::InterpersonalHopelessness => {
assert_eq!(p.name(), "Interpersonal Hopelessness")
}
MentalHealthPath::AcquiredCapability => assert_eq!(p.name(), "Acquired Capability"),
MentalHealthPath::ThwartedBelongingness => {
assert_eq!(p.name(), "Thwarted Belongingness")
}
MentalHealthPath::PerceivedBurdensomeness => {
assert_eq!(p.name(), "Perceived Burdensomeness")
}
MentalHealthPath::SuicidalDesire => assert_eq!(p.name(), "Suicidal Desire"),
MentalHealthPath::AttemptRisk => assert_eq!(p.name(), "Attempt Risk"),
}
}
}
#[test]
fn all_disposition_names() {
for p in DispositionPath::all() {
match p {
DispositionPath::ImpulseControl => assert_eq!(p.name(), "Impulse Control"),
DispositionPath::Empathy => assert_eq!(p.name(), "Empathy"),
DispositionPath::Aggression => assert_eq!(p.name(), "Aggression"),
DispositionPath::Grievance => assert_eq!(p.name(), "Grievance"),
DispositionPath::Reactance => assert_eq!(p.name(), "Reactance"),
DispositionPath::TrustorPropensity => assert_eq!(p.name(), "Trustor Propensity"),
}
}
}
#[test]
fn all_person_characteristics_names() {
for p in PersonCharacteristicsPath::all() {
match p {
PersonCharacteristicsPath::CognitiveAbility => {
assert_eq!(p.name(), "Cognitive Ability")
}
PersonCharacteristicsPath::EmotionalRegulationAssets => {
assert_eq!(p.name(), "Emotional Regulation Assets")
}
PersonCharacteristicsPath::SocialCapital => assert_eq!(p.name(), "Social Capital"),
PersonCharacteristicsPath::MaterialSecurity => {
assert_eq!(p.name(), "Material Security")
}
PersonCharacteristicsPath::ExperienceDiversity => {
assert_eq!(p.name(), "Experience Diversity")
}
PersonCharacteristicsPath::BaselineMotivation => {
assert_eq!(p.name(), "Baseline Motivation")
}
PersonCharacteristicsPath::PersistenceTendency => {
assert_eq!(p.name(), "Persistence Tendency")
}
PersonCharacteristicsPath::CuriosityTendency => {
assert_eq!(p.name(), "Curiosity Tendency")
}
PersonCharacteristicsPath::Resource => assert_eq!(p.name(), "Resource"),
PersonCharacteristicsPath::Force => assert_eq!(p.name(), "Force"),
}
}
}
}