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 = "PRESSURE_UNIT")] pub enum PressureUnit {
#[serde(alias = "HARTREE/BOHR**3", alias = "hartree/bohr**3")]
HartreePerBohr3,
#[serde(alias = "EV/ANG**3", alias = "ev/ang**3")]
EvPerAng3,
#[serde(alias = "PA", alias = "pa")]
Pascal,
#[serde(alias = "MPA", alias = "mpa")]
MegaPascal,
#[serde(alias = "GPA", alias = "gpa")]
#[default]
GigaPascal,
#[serde(alias = "ATM", alias = "atm")]
Atmosphere,
#[serde(alias = "BAR", alias = "bar")]
Bar,
#[serde(alias = "MBAR", alias = "mbar")]
MegaBar,
}
impl PressureUnit {
pub const fn default_unit() -> Self {
Self::GigaPascal }
}
impl FromCellValue for PressureUnit {
fn from_cell_value(value: &CellValue<'_>) -> CResult<Self> {
match value_as_str(value)?.to_ascii_lowercase().as_str() {
"hartree/bohr**3" => Ok(Self::HartreePerBohr3),
"ev/ang**3" => Ok(Self::EvPerAng3),
"pa" => Ok(Self::Pascal),
"mpa" => Ok(Self::MegaPascal),
"gpa" => Ok(Self::GigaPascal),
"atm" => Ok(Self::Atmosphere),
"bar" => Ok(Self::Bar),
"mbar" => Ok(Self::MegaBar),
other => Err(Error::Message(format!(
"unknown PressureUnit: {other}"
))),
}
}
}
impl ToCell for PressureUnit {
fn to_cell(&self) -> Cell<'_> {
Cell::KeyValue("PRESSURE_UNIT", self.to_cell_value())
}
}
impl ToCellValue for PressureUnit {
fn to_cell_value(&self) -> CellValue<'_> {
CellValue::String(
match self {
PressureUnit::HartreePerBohr3 => "hartree/bohr**3",
PressureUnit::EvPerAng3 => "ev/ang**3",
PressureUnit::Pascal => "pa",
PressureUnit::MegaPascal => "mpa",
PressureUnit::GigaPascal => "gpa",
PressureUnit::Atmosphere => "atm",
PressureUnit::Bar => "bar",
PressureUnit::MegaBar => "mbar",
}
.to_string(), )
}
}