Skip to main content

castep_cell_io/param/nmr/
magres_task.rs

1use castep_cell_fmt::{Cell, CellValue, ToCell, ToCellValue, CResult, Error};
2use castep_cell_fmt::parse::{FromCellValue, FromKeyValue};
3use castep_cell_fmt::query::value_as_str;
4use serde::{Deserialize, Serialize};
5
6/// Defines the type of NMR calculation to be performed.
7///
8/// Keyword type: String
9///
10/// Default: MagresTask::Shielding
11///
12/// Example:
13/// MAGRES_TASK : NMR
14#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
15#[serde(rename = "MAGRES_TASK")]
16#[derive(Default)]
17pub enum MagresTask {
18    /// Performs a calculation of the NMR shielding tensor for all atoms
19    #[serde(alias = "shielding", alias = "SHIELDING")]
20    #[default]
21    Shielding,
22    /// Performs a calculation of the electric field gradient tensor for all atoms
23    #[serde(alias = "efg", alias = "EFG")]
24    Efg,
25    /// Performs a calculation of both the NMR shielding tensor and the EFG tensor
26    #[serde(alias = "nmr", alias = "NMR")]
27    Nmr,
28}
29
30
31impl FromCellValue for MagresTask {
32    fn from_cell_value(value: &CellValue<'_>) -> CResult<Self> {
33        match value_as_str(value)?.to_ascii_lowercase().as_str() {
34            "shielding" => Ok(Self::Shielding),
35            "efg" => Ok(Self::Efg),
36            "nmr" => Ok(Self::Nmr),
37            other => Err(Error::Message(format!("unknown MagresTask: {other}"))),
38        }
39    }
40}
41
42impl FromKeyValue for MagresTask {
43    const KEY_NAME: &'static str = "MAGRES_TASK";
44
45    fn from_cell_value_kv(value: &CellValue<'_>) -> CResult<Self> {
46        Self::from_cell_value(value)
47    }
48}
49
50impl ToCell for MagresTask {
51    fn to_cell(&self) -> Cell<'_> {
52        Cell::KeyValue("MAGRES_TASK", self.to_cell_value())
53    }
54}
55
56impl ToCellValue for MagresTask {
57    fn to_cell_value(&self) -> CellValue<'_> {
58        CellValue::String(
59            match self {
60                MagresTask::Shielding => "Shielding",
61                MagresTask::Efg => "EFG",
62                MagresTask::Nmr => "NMR",
63            }
64            .to_string(),
65        )
66    }
67}
68
69#[cfg(test)]
70mod tests {
71    use super::*;
72    use castep_cell_fmt::CellValue;
73    use castep_cell_fmt::parse::FromCellValue;
74
75    #[test]
76    fn test_case_insensitive() {
77        assert_eq!(MagresTask::from_cell_value(&CellValue::Str("shielding")).unwrap(), MagresTask::Shielding);
78        assert_eq!(MagresTask::from_cell_value(&CellValue::Str("SHIELDING")).unwrap(), MagresTask::Shielding);
79        assert_eq!(MagresTask::from_cell_value(&CellValue::Str("efg")).unwrap(), MagresTask::Efg);
80    }
81
82    #[test]
83    fn test_all_variants() {
84        assert_eq!(MagresTask::from_cell_value(&CellValue::Str("nmr")).unwrap(), MagresTask::Nmr);
85    }
86
87    #[test]
88    fn test_invalid() {
89        assert!(MagresTask::from_cell_value(&CellValue::Str("invalid")).is_err());
90    }
91
92    #[test]
93    fn test_key_name() {
94        assert_eq!(MagresTask::KEY_NAME, "MAGRES_TASK");
95    }
96}
97