use crate::concern::Concerns;
#[derive(Debug)]
pub enum Error {
Contradiction(String),
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Error::Contradiction(reason) => {
write!(f, "contradiction encountered: {reason}")
}
}
}
}
impl std::error::Error for Error {}
#[derive(Debug)]
pub struct Result<E> {
concerns: Option<Concerns>,
tree: Option<E>,
}
impl<E> Result<E> {
pub fn try_new(
tree: Option<E>,
concerns: Option<Concerns>,
) -> std::result::Result<Self, Error> {
if concerns.is_none() && tree.is_none() {
return Err(Error::Contradiction(String::from(
"cannot create a parse Result with no concerns and no parse tree",
)));
}
Ok(Self { concerns, tree })
}
pub fn concerns(&self) -> Option<&Concerns> {
self.concerns.as_ref()
}
pub fn into_concerns(self) -> Option<Concerns> {
self.concerns
}
pub fn tree(&self) -> Option<&E> {
self.tree.as_ref()
}
pub fn into_tree(self) -> Option<E> {
self.tree
}
pub fn into_parts(self) -> (Option<E>, Option<Concerns>) {
(self.tree, self.concerns)
}
}