flexi_parse/
to_string.rs

1use crate::token::Token;
2use crate::Entry;
3use crate::TokenStream;
4
5use std::fmt;
6
7impl fmt::Display for TokenStream {
8    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
9        let mut last_token_end = usize::MAX;
10        let mut this_token_span;
11        for token in &self.tokens {
12            let string = match token {
13                Entry::Error(_) => return Err(fmt::Error),
14                Entry::Ident(ident) => {
15                    this_token_span = ident.span.clone();
16                    ident.string().to_owned()
17                }
18                Entry::Punct(punct) => {
19                    this_token_span = punct.span.clone();
20                    char::from(punct.kind).to_string()
21                }
22                Entry::WhiteSpace(whitespace) => {
23                    this_token_span = whitespace.span().clone();
24                    whitespace.display()
25                }
26                #[cfg(feature = "scan-strings")]
27                Entry::LitStrDoubleQuote(str) => {
28                    this_token_span = str.span().clone();
29                    format!(r#""{}""#, str.string())
30                }
31                #[cfg(feature = "scan-strings")]
32                Entry::LitStrSingleQuote(str) => {
33                    this_token_span = str.span().clone();
34                    format!("'{}'", str.string())
35                }
36            };
37            for _ in last_token_end..this_token_span.start {
38                write!(f, " ")?;
39            }
40            write!(f, "{string}")?;
41            last_token_end = this_token_span.end;
42        }
43
44        Ok(())
45    }
46}