castep_cell_parser/pest_parser/
cell_object.rs1use 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}