use std::{collections::VecDeque, fmt::Display};
use serde::{Deserialize, Serialize};
use mck::refin::RefinementValue;
use crate::StateId;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum KnownConclusion {
False,
True,
Dependent,
}
#[derive(Debug, Clone, Hash, Serialize, Deserialize)]
pub enum Conclusion {
Known(KnownConclusion),
Unknown(Culprit),
NotCheckable,
}
#[derive(Debug, Clone, Hash, Serialize, Deserialize)]
pub struct Culprit {
pub path: VecDeque<StateId>,
pub result: RefinementValue,
pub panic: RefinementValue,
}
impl KnownConclusion {
pub fn try_into_bool(self) -> Option<bool> {
match self {
KnownConclusion::False => Some(false),
KnownConclusion::True => Some(true),
KnownConclusion::Dependent => None,
}
}
}
impl Display for KnownConclusion {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let str = match self {
KnownConclusion::False => "false",
KnownConclusion::True => "true",
KnownConclusion::Dependent => "dependent",
};
write!(f, "{}", str)
}
}