use castep_cell_fmt::{Cell, CellValue, ToCell, ToCellValue};
use castep_cell_fmt::parse::FromCellValue;
use castep_cell_fmt::{CResult, Error};
use castep_cell_fmt::query::value_as_str;
use serde::{Deserialize, Serialize};
#[derive(
Debug, Default, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize,
)]
#[serde(rename = "FORCE_UNIT")] pub enum ForceUnit {
#[serde(alias = "HARTREE/BOHR", alias = "hartree/bohr")]
HartreePerBohr,
#[serde(alias = "EV/ANG", alias = "ev/ang")]
#[default]
EvPerAng,
#[serde(alias = "N", alias = "n")]
Newton,
}
impl FromCellValue for ForceUnit {
fn from_cell_value(value: &CellValue<'_>) -> CResult<Self> {
match value_as_str(value)?.to_ascii_lowercase().as_str() {
"hartree/bohr" => Ok(Self::HartreePerBohr),
"ev/ang" => Ok(Self::EvPerAng),
"n" => Ok(Self::Newton),
other => Err(Error::Message(format!(
"unknown ForceUnit: {other}"
))),
}
}
}
impl ToCell for ForceUnit {
fn to_cell(&self) -> Cell<'_> {
Cell::KeyValue("FORCE_UNIT", self.to_cell_value())
}
}
impl ToCellValue for ForceUnit {
fn to_cell_value(&self) -> CellValue<'_> {
CellValue::String(
match self {
ForceUnit::HartreePerBohr => "hartree/bohr",
ForceUnit::EvPerAng => "ev/ang",
ForceUnit::Newton => "n",
}
.to_string(), )
}
}