castep_cell_io/param/nmr/
magres_task.rs1use 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#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
15#[serde(rename = "MAGRES_TASK")]
16#[derive(Default)]
17pub enum MagresTask {
18 #[serde(alias = "shielding", alias = "SHIELDING")]
20 #[default]
21 Shielding,
22 #[serde(alias = "efg", alias = "EFG")]
24 Efg,
25 #[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