#![doc = include_str!("../RULES.md")]
#![warn(missing_docs)]
#![warn(rust_2018_idioms)]
#![warn(rust_2021_compatibility)]
#![warn(missing_debug_implementations)]
#![warn(clippy::missing_docs_in_private_items)]
#![warn(rustdoc::broken_intra_doc_links)]
use std::collections::HashSet;
use wdl_ast::AstToken;
use wdl_ast::Comment;
use wdl_ast::Direction;
use wdl_ast::Directive;
use wdl_ast::SyntaxKind;
use wdl_ast::SyntaxNode;
mod analyzer;
pub mod config;
pub mod diagnostics;
pub mod document;
pub mod eval;
mod graph;
pub mod handlers;
mod queue;
mod rayon;
mod rules;
pub mod stdlib;
pub mod types;
mod validation;
mod visitor;
pub use analyzer::*;
pub use config::Config;
pub use config::DiagnosticsConfig;
pub use config::FeatureFlags;
pub use document::Document;
pub use rules::*;
pub use validation::*;
pub use visitor::*;
pub trait Exceptable {
fn rule_exceptions(&self) -> HashSet<String> {
HashSet::new()
}
fn is_rule_excepted(&self, _id: &str) -> bool {
true
}
}
impl Exceptable for SyntaxNode {
fn rule_exceptions(&self) -> HashSet<String> {
self.siblings_with_tokens(Direction::Prev)
.skip(1) .map_while(|s| {
if s.kind() == SyntaxKind::Whitespace || s.kind() == SyntaxKind::Comment {
s.into_token()
} else {
None
}
})
.filter_map(Comment::cast)
.filter_map(|c| c.directive())
.flat_map(|d| match d {
Directive::Except(e) => e,
})
.collect()
}
fn is_rule_excepted(&self, id: &str) -> bool {
self.rule_exceptions().contains(id)
}
}