Skip to main content

entrenar/research/artifact/
role.rs

1//! Contributor roles following the CRediT taxonomy.
2
3use serde::{Deserialize, Serialize};
4
5/// Contributor roles following the CRediT (Contributor Roles Taxonomy)
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
7pub enum ContributorRole {
8    /// Ideas; formulation or evolution of overarching research goals and aims
9    Conceptualization,
10    /// Management activities to annotate, scrub data and maintain research data
11    DataCuration,
12    /// Application of statistical, mathematical, computational techniques
13    FormalAnalysis,
14    /// Acquisition of financial support for the project
15    FundingAcquisition,
16    /// Conducting research and investigation process
17    Investigation,
18    /// Development or design of methodology
19    Methodology,
20    /// Management and coordination responsibility
21    ProjectAdministration,
22    /// Provision of study materials, reagents, materials, laboratory samples
23    Resources,
24    /// Programming, software development; designing computer programs
25    Software,
26    /// Oversight and leadership responsibility
27    Supervision,
28    /// Verification of results/experiments
29    Validation,
30    /// Preparation, creation and/or presentation of data visualization
31    Visualization,
32    /// Preparation and creation of the published work (original draft)
33    WritingOriginal,
34    /// Critical review, commentary or revision
35    WritingReview,
36}
37
38impl std::fmt::Display for ContributorRole {
39    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
40        match self {
41            Self::Conceptualization => write!(f, "Conceptualization"),
42            Self::DataCuration => write!(f, "Data curation"),
43            Self::FormalAnalysis => write!(f, "Formal analysis"),
44            Self::FundingAcquisition => write!(f, "Funding acquisition"),
45            Self::Investigation => write!(f, "Investigation"),
46            Self::Methodology => write!(f, "Methodology"),
47            Self::ProjectAdministration => write!(f, "Project administration"),
48            Self::Resources => write!(f, "Resources"),
49            Self::Software => write!(f, "Software"),
50            Self::Supervision => write!(f, "Supervision"),
51            Self::Validation => write!(f, "Validation"),
52            Self::Visualization => write!(f, "Visualization"),
53            Self::WritingOriginal => write!(f, "Writing – original draft"),
54            Self::WritingReview => write!(f, "Writing – review & editing"),
55        }
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62
63    #[test]
64    fn test_contributor_role_display() {
65        assert_eq!(ContributorRole::Conceptualization.to_string(), "Conceptualization");
66        assert_eq!(ContributorRole::DataCuration.to_string(), "Data curation");
67        assert_eq!(ContributorRole::FormalAnalysis.to_string(), "Formal analysis");
68        assert_eq!(ContributorRole::FundingAcquisition.to_string(), "Funding acquisition");
69        assert_eq!(ContributorRole::Investigation.to_string(), "Investigation");
70        assert_eq!(ContributorRole::Methodology.to_string(), "Methodology");
71        assert_eq!(ContributorRole::ProjectAdministration.to_string(), "Project administration");
72        assert_eq!(ContributorRole::Resources.to_string(), "Resources");
73        assert_eq!(ContributorRole::Software.to_string(), "Software");
74        assert_eq!(ContributorRole::Supervision.to_string(), "Supervision");
75        assert_eq!(ContributorRole::Validation.to_string(), "Validation");
76        assert_eq!(ContributorRole::Visualization.to_string(), "Visualization");
77        assert_eq!(ContributorRole::WritingOriginal.to_string(), "Writing – original draft");
78        assert_eq!(ContributorRole::WritingReview.to_string(), "Writing – review & editing");
79    }
80
81    #[test]
82    fn test_contributor_role_clone() {
83        let role = ContributorRole::Software;
84        let cloned = role;
85        assert_eq!(role, cloned);
86    }
87
88    #[test]
89    fn test_contributor_role_debug() {
90        let role = ContributorRole::Software;
91        assert_eq!(format!("{role:?}"), "Software");
92    }
93
94    #[test]
95    fn test_contributor_role_eq() {
96        assert_eq!(ContributorRole::Software, ContributorRole::Software);
97        assert_ne!(ContributorRole::Software, ContributorRole::Validation);
98    }
99
100    #[test]
101    fn test_contributor_role_hash() {
102        use std::collections::HashSet;
103        let mut set = HashSet::new();
104        set.insert(ContributorRole::Software);
105        set.insert(ContributorRole::Software);
106        assert_eq!(set.len(), 1);
107        set.insert(ContributorRole::Validation);
108        assert_eq!(set.len(), 2);
109    }
110
111    #[test]
112    fn test_contributor_role_serde() {
113        let role = ContributorRole::Software;
114        let json = serde_json::to_string(&role).expect("JSON serialization should succeed");
115        let deserialized: ContributorRole =
116            serde_json::from_str(&json).expect("JSON deserialization should succeed");
117        assert_eq!(role, deserialized);
118    }
119}