use super::SourceLanguage;
use crate::model::{SourceLocation, StepDefinition};
use std::path::PathBuf;
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum UncertaintyScope {
Definition(SourceLocation),
File(PathBuf),
Registry(SourceLanguage),
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UncertaintyCause {
Registration,
Handler,
Source,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SourceUncertainty {
pub scope: UncertaintyScope,
pub cause: UncertaintyCause,
pub message: String,
}
impl SourceUncertainty {
pub fn new(
scope: UncertaintyScope,
cause: UncertaintyCause,
message: impl Into<String>,
) -> Self {
Self {
scope,
cause,
message: message.into(),
}
}
fn affects(&self, definition: &StepDefinition) -> bool {
match &self.scope {
UncertaintyScope::Definition(location) => &definition.location == location,
UncertaintyScope::File(path) => &definition.location.path == path,
UncertaintyScope::Registry(language) => {
definition.analysis_profile().comparison_domain == language.comparison_domain()
}
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SourceAdvisory {
pub location: SourceLocation,
pub message: String,
}
impl SourceAdvisory {
pub fn new(location: SourceLocation, message: impl Into<String>) -> Self {
Self {
location,
message: message.into(),
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct SourceFinalization {
pub uncertainties: Vec<SourceUncertainty>,
pub advisories: Vec<SourceAdvisory>,
}
impl SourceFinalization {
pub fn apply(&self, definitions: &mut Vec<StepDefinition>) {
for uncertainty in &self.uncertainties {
match uncertainty.cause {
UncertaintyCause::Registration => {
definitions.retain(|definition| !uncertainty.affects(definition))
}
UncertaintyCause::Handler => {
for definition in definitions
.iter_mut()
.filter(|definition| uncertainty.affects(definition))
{
definition.handler.comparable = false;
}
}
UncertaintyCause::Source => {}
}
}
}
}