castep_cell_parser/pest_parser/
cell_object.rs

1use std::fmt::Display;
2
3use super::{Block, KeywordValue, SingleKeyword};
4
5#[derive(Debug, Clone, PartialEq)]
6pub enum CELLObject {
7    Block(Block),
8    KeywordValue(KeywordValue),
9    SingleKeyword(SingleKeyword),
10}
11
12impl PartialOrd for CELLObject {
13    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
14        self.order().partial_cmp(&other.order())
15    }
16}
17
18impl CELLObject {
19    pub fn order(&self) -> usize {
20        match self {
21            CELLObject::Block(block) => block.order(),
22            CELLObject::KeywordValue(keyword_value) => keyword_value.order(),
23            CELLObject::SingleKeyword(single_keyword) => single_keyword.order(),
24        }
25    }
26
27    pub fn as_block(&self) -> Option<&Block> {
28        if let Self::Block(v) = self {
29            Some(v)
30        } else {
31            None
32        }
33    }
34
35    pub fn as_keyword_value(&self) -> Option<&KeywordValue> {
36        if let Self::KeywordValue(v) = self {
37            Some(v)
38        } else {
39            None
40        }
41    }
42
43    pub fn as_single_keyword(&self) -> Option<&SingleKeyword> {
44        if let Self::SingleKeyword(v) = self {
45            Some(v)
46        } else {
47            None
48        }
49    }
50}
51
52impl Display for CELLObject {
53    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
54        write!(
55            f,
56            "{}",
57            match self {
58                CELLObject::Block(block) => block.to_string(),
59                CELLObject::KeywordValue(keyword_value) => keyword_value.to_string(),
60                CELLObject::SingleKeyword(single_keyword) => single_keyword.to_string(),
61            }
62        )
63    }
64}