use crate::snippets::runner::RunnerConfig;
use crate::snippets::types::{Snippet, SnippetAnnotationKind, ValidationLevel};
pub(super) fn annotation_level_limit(snippet: &Snippet) -> Option<ValidationLevel> {
snippet
.annotation
.as_ref()
.and_then(|annotation| match annotation.kind {
SnippetAnnotationKind::SyntaxOnly => Some(ValidationLevel::Syntax),
SnippetAnnotationKind::CompileOnly => Some(ValidationLevel::Compile),
SnippetAnnotationKind::TypeCheckOnly => Some(ValidationLevel::TypeCheck),
SnippetAnnotationKind::Skip => None,
})
}
pub(super) fn effective_validation_level(snippet: &Snippet, requested: ValidationLevel) -> ValidationLevel {
[annotation_level_limit(snippet), snippet.metadata.level]
.into_iter()
.flatten()
.fold(requested, ValidationLevel::min)
}
pub(super) fn capped_level(
snippet: &Snippet,
config: &RunnerConfig,
validator: &dyn crate::snippets::validators::SnippetValidator,
) -> ValidationLevel {
effective_validation_level(snippet, config.level)
.min(validator.max_level())
.min(validator.achievable_level(config.level))
}
pub(super) fn structurally_unreachable(
validator: &dyn crate::snippets::validators::SnippetValidator,
requested: ValidationLevel,
) -> bool {
validator.max_level() < requested
|| (validator.achievable_level(requested) < requested && validator.achievable_level_is_structural(requested))
}