mod post;
mod pre;
use std::fmt::Display;
use std::rc::Rc;
pub use post::*;
pub use pre::*;
use crate::Config;
pub trait Token: Eq + PartialEq {
fn display<'a>(&'a self, config: &'a Config) -> impl Display + 'a;
}
#[derive(Debug, Clone)]
pub struct TokenStream<T: Token>(Vec<T>);
impl<T: Token> Default for TokenStream<T> {
fn default() -> Self {
Self(Default::default())
}
}
impl<T: Token> TokenStream<T> {
pub fn push(&mut self, token: T) {
self.0.push(token);
}
pub fn trim_end(&mut self, token: &T) {
while Some(token) == self.0.last() {
let _ = self.0.pop();
}
}
pub fn trim_while<F: Fn(&T) -> bool>(&mut self, predicate: F) {
while let Some(token) = self.0.last() {
if !predicate(token) {
break;
}
let _ = self.0.pop();
}
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn iter(&self) -> std::slice::Iter<'_, T> {
self.0.iter()
}
pub fn clear(&mut self) {
self.0.clear();
}
pub fn extend(&mut self, other: Self) {
self.0.extend(other.0);
}
}
impl<T: Token> IntoIterator for TokenStream<T> {
type IntoIter = std::vec::IntoIter<Self::Item>;
type Item = T;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Comment {
Directive(Rc<wdl_ast::Directive>),
Documentation(Rc<String>),
Preceding(Rc<String>),
Inline(Rc<String>),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Trivia {
BlankLine,
Comment(Comment),
}
#[derive(Eq, PartialEq, Default, Debug, Clone, Copy)]
pub enum TriviaBlankLineSpacingPolicy {
RemoveTrailingBlanks,
#[default]
Always,
}