castep_cell_io/cell_document/units/
length_units.rs1use 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}