1mod post;
4mod pre;
5
6use std::fmt::Display;
7use std::rc::Rc;
8
9pub use post::*;
10pub use pre::*;
11
12use crate::Config;
13
14pub trait Token: Eq + PartialEq {
16 fn display<'a>(&'a self, config: &'a Config) -> impl Display + 'a;
18}
19
20#[derive(Debug, Clone)]
24pub struct TokenStream<T: Token>(Vec<T>);
25
26impl<T: Token> Default for TokenStream<T> {
27 fn default() -> Self {
28 Self(Default::default())
29 }
30}
31
32impl<T: Token> TokenStream<T> {
33 pub fn push(&mut self, token: T) {
35 self.0.push(token);
36 }
37
38 pub fn trim_end(&mut self, token: &T) {
40 while Some(token) == self.0.last() {
41 let _ = self.0.pop();
42 }
43 }
44
45 pub fn trim_while<F: Fn(&T) -> bool>(&mut self, predicate: F) {
47 while let Some(token) = self.0.last() {
48 if !predicate(token) {
49 break;
50 }
51
52 let _ = self.0.pop();
53 }
54 }
55
56 pub fn is_empty(&self) -> bool {
58 self.0.is_empty()
59 }
60
61 pub fn iter(&self) -> std::slice::Iter<'_, T> {
63 self.0.iter()
64 }
65
66 pub fn clear(&mut self) {
68 self.0.clear();
69 }
70
71 pub fn extend(&mut self, other: Self) {
73 self.0.extend(other.0);
74 }
75}
76
77impl<T: Token> IntoIterator for TokenStream<T> {
78 type IntoIter = std::vec::IntoIter<Self::Item>;
79 type Item = T;
80
81 fn into_iter(self) -> Self::IntoIter {
82 self.0.into_iter()
83 }
84}
85
86#[derive(Clone, Debug, Eq, PartialEq)]
88pub enum Comment {
89 Preceding(Rc<String>),
91 Inline(Rc<String>),
93}
94
95#[derive(Clone, Debug, Eq, PartialEq)]
97pub enum Trivia {
98 BlankLine,
100 Comment(Comment),
102}
103
104#[derive(Eq, PartialEq, Default, Debug, Clone, Copy)]
108pub enum TriviaBlankLineSpacingPolicy {
109 RemoveTrailingBlanks,
114 #[default]
116 Always,
117}