use std::error::Error;
use std::fmt;
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum FormulaParseError {
EmptyFormula,
EmptyPart,
EmptyGroup,
InvalidSymbol(String),
InvalidNumber(String),
ZeroCount,
ZeroMultiplier,
UnexpectedCharacter(char),
UnexpectedEnd,
UnmatchedOpenGroup,
UnmatchedCloseGroup,
TrailingSeparator,
}
impl fmt::Display for FormulaParseError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::EmptyFormula => formatter.write_str("formula is empty"),
Self::EmptyPart => formatter.write_str("formula part is empty"),
Self::EmptyGroup => formatter.write_str("formula group is empty"),
Self::InvalidSymbol(symbol) => write!(formatter, "invalid element symbol: {symbol}"),
Self::InvalidNumber(number) => write!(formatter, "invalid formula number: {number}"),
Self::ZeroCount => formatter.write_str("element count must be greater than zero"),
Self::ZeroMultiplier => {
formatter.write_str("formula multiplier must be greater than zero")
},
Self::UnexpectedCharacter(character) => {
write!(formatter, "unexpected character in formula: {character}")
},
Self::UnexpectedEnd => formatter.write_str("unexpected end of formula"),
Self::UnmatchedOpenGroup => {
formatter.write_str("formula group is missing a closing parenthesis")
},
Self::UnmatchedCloseGroup => {
formatter.write_str("formula has an unmatched closing parenthesis")
},
Self::TrailingSeparator => {
formatter.write_str("hydrate separator must be followed by a formula part")
},
}
}
}
impl Error for FormulaParseError {}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum FormulaValidationError {
EmptyTerms,
EmptyPart,
EmptyGroup,
InvalidSymbol(String),
ZeroCount,
ZeroMultiplier,
}
impl fmt::Display for FormulaValidationError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::EmptyTerms => formatter.write_str("formula term list is empty"),
Self::EmptyPart => formatter.write_str("formula part is empty"),
Self::EmptyGroup => formatter.write_str("formula group is empty"),
Self::InvalidSymbol(symbol) => write!(formatter, "invalid element symbol: {symbol}"),
Self::ZeroCount => formatter.write_str("element count must be greater than zero"),
Self::ZeroMultiplier => {
formatter.write_str("formula multiplier must be greater than zero")
},
}
}
}
impl Error for FormulaValidationError {}
impl From<FormulaValidationError> for FormulaParseError {
fn from(error: FormulaValidationError) -> Self {
match error {
FormulaValidationError::EmptyTerms | FormulaValidationError::EmptyPart => {
Self::EmptyPart
},
FormulaValidationError::EmptyGroup => Self::EmptyGroup,
FormulaValidationError::InvalidSymbol(symbol) => Self::InvalidSymbol(symbol),
FormulaValidationError::ZeroCount => Self::ZeroCount,
FormulaValidationError::ZeroMultiplier => Self::ZeroMultiplier,
}
}
}