reifydb_macro_impl/
generate.rs1use proc_macro2::{Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree};
7
8pub fn ident(name: &str) -> TokenTree {
10 TokenTree::Ident(Ident::new(name, Span::call_site()))
11}
12
13pub fn underscore() -> TokenTree {
16 "_".parse::<TokenStream>().unwrap().into_iter().next().unwrap()
17}
18
19#[allow(dead_code)]
21pub fn ident_raw(name: &str) -> TokenTree {
22 if let Some(stripped) = name.strip_prefix("r#") {
23 TokenTree::Ident(Ident::new_raw(stripped, Span::call_site()))
24 } else {
25 TokenTree::Ident(Ident::new(name, Span::call_site()))
26 }
27}
28
29pub fn punct(ch: char) -> TokenTree {
31 TokenTree::Punct(Punct::new(ch, Spacing::Alone))
32}
33
34pub fn punct_joint(ch: char) -> TokenTree {
36 TokenTree::Punct(Punct::new(ch, Spacing::Joint))
37}
38
39pub fn literal_str(s: &str) -> TokenTree {
41 TokenTree::Literal(Literal::string(s))
42}
43
44pub fn literal_usize(n: usize) -> TokenTree {
46 TokenTree::Literal(Literal::usize_unsuffixed(n))
47}
48
49pub fn group(delimiter: Delimiter, tokens: impl IntoIterator<Item = TokenTree>) -> TokenTree {
51 TokenTree::Group(Group::new(delimiter, tokens.into_iter().collect()))
52}
53
54pub fn parens(tokens: impl IntoIterator<Item = TokenTree>) -> TokenTree {
56 group(Delimiter::Parenthesis, tokens)
57}
58
59pub fn braces(tokens: impl IntoIterator<Item = TokenTree>) -> TokenTree {
61 group(Delimiter::Brace, tokens)
62}
63
64pub fn brackets(tokens: impl IntoIterator<Item = TokenTree>) -> TokenTree {
66 group(Delimiter::Bracket, tokens)
67}
68
69pub fn path_sep() -> impl Iterator<Item = TokenTree> {
71 [punct_joint(':'), punct(':')].into_iter()
72}
73
74pub fn path(segments: &[&str]) -> Vec<TokenTree> {
77 let mut tokens = Vec::new();
78 let mut prev_was_empty = false;
79
80 for (i, seg) in segments.iter().enumerate() {
81 let need_sep = if i == 0 {
85 seg.is_empty() } else {
87 !prev_was_empty };
89
90 if need_sep {
91 tokens.extend(path_sep());
92 }
93
94 if !seg.is_empty() {
95 tokens.push(ident(seg));
96 }
97
98 prev_was_empty = seg.is_empty();
99 }
100 tokens
101}
102
103pub fn arrow() -> impl Iterator<Item = TokenTree> {
105 [punct_joint('-'), punct('>')].into_iter()
106}
107
108pub fn fat_arrow() -> impl Iterator<Item = TokenTree> {
110 [punct_joint('='), punct('>')].into_iter()
111}
112
113#[allow(dead_code)]
115pub fn generics(inner: impl IntoIterator<Item = TokenTree>) -> Vec<TokenTree> {
116 let mut tokens = vec![punct('<')];
117 tokens.extend(inner);
118 tokens.push(punct('>'));
119 tokens
120}
121
122#[allow(dead_code)]
124pub fn extend(tokens: &mut Vec<TokenTree>, iter: impl IntoIterator<Item = TokenTree>) {
125 tokens.extend(iter);
126}
127
128pub fn compile_error(message: &str) -> TokenStream {
130 let tokens = vec![ident("compile_error"), punct('!'), parens([literal_str(message)])];
131 tokens.into_iter().collect()
132}