glsl_lang_pp/util/
text_token.rs

1use std::ops::{Deref, DerefMut};
2
3use lang_util::TextRange;
4
5use super::TokenText;
6
7// A token somewhere in a source file
8#[derive(Debug, Clone, Copy)]
9pub struct TextToken<T> {
10    pub token: T,
11    pub range: TextRange,
12}
13
14impl<T> TextToken<T> {
15    pub fn new(token: T, range: TextRange) -> Self {
16        Self { token, range }
17    }
18
19    pub fn raw<'s>(&self, input: &'s str) -> &'s str {
20        &input[self.range]
21    }
22
23    pub fn text<'s>(&self, input: &'s str) -> TokenText<'s> {
24        TokenText::raw(&input[self.range])
25    }
26
27    pub fn map<U>(self, f: impl FnOnce(T) -> U) -> TextToken<U> {
28        TextToken {
29            token: f(self.token),
30            range: self.range,
31        }
32    }
33
34    pub fn transmute<U: From<T>>(self) -> TextToken<U> {
35        TextToken {
36            token: self.token.into(),
37            range: self.range,
38        }
39    }
40}
41
42impl<T> Deref for TextToken<T> {
43    type Target = T;
44
45    fn deref(&self) -> &Self::Target {
46        &self.token
47    }
48}
49
50impl<T> DerefMut for TextToken<T> {
51    fn deref_mut(&mut self) -> &mut Self::Target {
52        &mut self.token
53    }
54}