castep_cell_io/cell_document/units/
length_units.rs

1use std::fmt::Display;
2
3use crate::CellParseError;
4
5use super::ParsableUnit;
6
7#[derive(Debug, Default, Clone, Copy)]
8pub enum LengthUnit {
9    Bohr,
10    Meter,
11    Centimeter,
12    Nanometer,
13    #[default]
14    Ang,
15}
16
17impl Display for LengthUnit {
18    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
19        match self {
20            LengthUnit::Bohr => f.write_str("bohr"),
21            LengthUnit::Meter => f.write_str("m"),
22            LengthUnit::Centimeter => f.write_str("cm"),
23            LengthUnit::Nanometer => f.write_str("nm"),
24            LengthUnit::Ang => f.write_str("ang"),
25        }
26    }
27}
28
29impl ParsableUnit for LengthUnit {
30    fn parse_from_str(input: &str) -> Result<Self, CellParseError> {
31        match input {
32            "bohr" => Ok(LengthUnit::Bohr),
33            "a0" => Ok(LengthUnit::Bohr),
34            "m" => Ok(LengthUnit::Meter),
35            "cm" => Ok(LengthUnit::Centimeter),
36            "nm" => Ok(LengthUnit::Nanometer),
37            "ang" => Ok(LengthUnit::Ang),
38            _ => Err(CellParseError::Invalid),
39        }
40    }
41}
42
43#[derive(Debug, Default, Clone, Copy)]
44pub enum InvLengthUnit {
45    Bohr,
46    Meter,
47    Nanometer,
48    #[default]
49    Ang,
50}
51
52impl Display for InvLengthUnit {
53    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
54        match self {
55            InvLengthUnit::Bohr => f.write_str("1/"),
56            InvLengthUnit::Meter => f.write_str("1/m"),
57            InvLengthUnit::Nanometer => f.write_str("1/nm"),
58            InvLengthUnit::Ang => f.write_str("1/ang"),
59        }
60    }
61}
62
63impl ParsableUnit for InvLengthUnit {
64    fn parse_from_str(input: &str) -> Result<Self, CellParseError> {
65        match input {
66            "1/" => Ok(InvLengthUnit::Bohr),
67            "1/m" => Ok(InvLengthUnit::Meter),
68            "1/nm" => Ok(InvLengthUnit::Nanometer),
69            "1/ang" => Ok(InvLengthUnit::Ang),
70            _ => Err(CellParseError::Invalid),
71        }
72    }
73}