use castep_cell_fmt::{CellValue, 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 = "EFIELD_UNIT")] pub enum EFieldUnit {
#[serde(rename = "ev/ang/e", alias = "EV/ANG/E")] #[default]
EvPerAngPerE,
#[serde(rename = "hartree/bohr/e", alias = "HARTREE/BOHR/E")]
HartreePerBohrPerE,
#[serde(rename = "N/C", alias = "n/c")]
NewtonPerCharge,
}
impl FromCellValue for EFieldUnit {
fn from_cell_value(value: &CellValue<'_>) -> CResult<Self> {
match value_as_str(value)?.to_ascii_lowercase().as_str() {
"ev/ang/e" => Ok(Self::EvPerAngPerE),
"hartree/bohr/e" => Ok(Self::HartreePerBohrPerE),
"n/c" => Ok(Self::NewtonPerCharge),
other => Err(Error::Message(format!(
"unknown EFieldUnit: {other}"
))),
}
}
}
impl ToCellValue for EFieldUnit {
fn to_cell_value(&self) -> CellValue<'_> {
CellValue::String(
match self {
EFieldUnit::EvPerAngPerE => "ev/ang/e",
EFieldUnit::HartreePerBohrPerE => "hartree/bohr/e",
EFieldUnit::NewtonPerCharge => "n/c", }
.to_string(), )
}
}