use std::collections::VecDeque;
use crate::SourceMap;
use crate::token::GraphQLToken;
use crate::token::GraphQLTokenKind;
use crate::token::GraphQLTokenSource;
pub struct GraphQLTokenStream<
'src,
TTokenSource: GraphQLTokenSource<'src>,
> {
token_source: TTokenSource,
buffer: VecDeque<GraphQLToken<'src>>,
}
impl<'src, TTokenSource: GraphQLTokenSource<'src>>
GraphQLTokenStream<'src, TTokenSource>
{
pub fn consume(&mut self) -> Option<GraphQLToken<'src>> {
self.ensure_buffer_has(1);
self.buffer.pop_front()
}
pub fn current_buffer_len(&self) -> usize {
self.buffer.len()
}
fn ensure_buffer_has(&mut self, count: usize) {
while self.buffer.len() < count {
if let Some(token) = self.token_source.next() {
self.buffer.push_back(token);
} else {
break;
}
}
}
pub fn is_at_end(&mut self) -> bool {
match self.peek() {
None => true,
Some(token) => {
matches!(token.kind, GraphQLTokenKind::Eof)
},
}
}
pub fn new(token_source: TTokenSource) -> Self {
Self {
token_source,
buffer: VecDeque::new(),
}
}
#[inline]
pub fn peek(&mut self) -> Option<&GraphQLToken<'src>> {
self.peek_nth(0)
}
pub fn peek_nth(
&mut self,
n: usize,
) -> Option<&GraphQLToken<'src>> {
self.ensure_buffer_has(n + 1);
self.buffer.get(n)
}
pub fn source_map(&self) -> &SourceMap<'src> {
self.token_source.source_map()
}
pub fn into_source_map(self) -> SourceMap<'src> {
self.token_source.into_source_map()
}
}