castep-cell-parser 0.1.2

basic parser built on `pest` for `castep` `.cell` and `.param`
Documentation
use std::fmt::Display;

use super::{Block, KeywordValue, SingleKeyword};

#[derive(Debug, Clone, PartialEq)]
pub enum CELLObject {
    Block(Block),
    KeywordValue(KeywordValue),
    SingleKeyword(SingleKeyword),
}

impl PartialOrd for CELLObject {
    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
        self.order().partial_cmp(&other.order())
    }
}

impl CELLObject {
    pub fn order(&self) -> usize {
        match self {
            CELLObject::Block(block) => block.order(),
            CELLObject::KeywordValue(keyword_value) => keyword_value.order(),
            CELLObject::SingleKeyword(single_keyword) => single_keyword.order(),
        }
    }

    pub fn as_block(&self) -> Option<&Block> {
        if let Self::Block(v) = self {
            Some(v)
        } else {
            None
        }
    }

    pub fn as_keyword_value(&self) -> Option<&KeywordValue> {
        if let Self::KeywordValue(v) = self {
            Some(v)
        } else {
            None
        }
    }

    pub fn as_single_keyword(&self) -> Option<&SingleKeyword> {
        if let Self::SingleKeyword(v) = self {
            Some(v)
        } else {
            None
        }
    }
}

impl Display for CELLObject {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(
            f,
            "{}",
            match self {
                CELLObject::Block(block) => block.to_string(),
                CELLObject::KeywordValue(keyword_value) => keyword_value.to_string(),
                CELLObject::SingleKeyword(single_keyword) => single_keyword.to_string(),
            }
        )
    }
}