glsl_lang_pp/util/
text_token.rs1use std::ops::{Deref, DerefMut};
2
3use lang_util::TextRange;
4
5use super::TokenText;
6
7#[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}