reifydb_macro_impl/
generate.rs1use proc_macro2::{Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree};
5
6pub fn ident(name: &str) -> TokenTree {
8 TokenTree::Ident(Ident::new(name, Span::call_site()))
9}
10
11pub fn underscore() -> TokenTree {
14 "_".parse::<TokenStream>().unwrap().into_iter().next().unwrap()
15}
16
17#[allow(dead_code)]
19pub fn ident_raw(name: &str) -> TokenTree {
20 if let Some(stripped) = name.strip_prefix("r#") {
21 TokenTree::Ident(Ident::new_raw(stripped, Span::call_site()))
22 } else {
23 TokenTree::Ident(Ident::new(name, Span::call_site()))
24 }
25}
26
27pub fn punct(ch: char) -> TokenTree {
29 TokenTree::Punct(Punct::new(ch, Spacing::Alone))
30}
31
32pub fn punct_joint(ch: char) -> TokenTree {
34 TokenTree::Punct(Punct::new(ch, Spacing::Joint))
35}
36
37pub fn literal_str(s: &str) -> TokenTree {
39 TokenTree::Literal(Literal::string(s))
40}
41
42pub fn literal_usize(n: usize) -> TokenTree {
44 TokenTree::Literal(Literal::usize_unsuffixed(n))
45}
46
47pub fn group(delimiter: Delimiter, tokens: impl IntoIterator<Item = TokenTree>) -> TokenTree {
49 TokenTree::Group(Group::new(delimiter, tokens.into_iter().collect()))
50}
51
52pub fn parens(tokens: impl IntoIterator<Item = TokenTree>) -> TokenTree {
54 group(Delimiter::Parenthesis, tokens)
55}
56
57pub fn braces(tokens: impl IntoIterator<Item = TokenTree>) -> TokenTree {
59 group(Delimiter::Brace, tokens)
60}
61
62pub fn brackets(tokens: impl IntoIterator<Item = TokenTree>) -> TokenTree {
64 group(Delimiter::Bracket, tokens)
65}
66
67pub fn path_sep() -> impl Iterator<Item = TokenTree> {
69 [punct_joint(':'), punct(':')].into_iter()
70}
71
72pub fn path(segments: &[&str]) -> Vec<TokenTree> {
75 let mut tokens = Vec::new();
76 let mut prev_was_empty = false;
77
78 for (i, seg) in segments.iter().enumerate() {
79 let need_sep = if i == 0 {
83 seg.is_empty() } else {
85 !prev_was_empty };
87
88 if need_sep {
89 tokens.extend(path_sep());
90 }
91
92 if !seg.is_empty() {
93 tokens.push(ident(seg));
94 }
95
96 prev_was_empty = seg.is_empty();
97 }
98 tokens
99}
100
101pub fn arrow() -> impl Iterator<Item = TokenTree> {
103 [punct_joint('-'), punct('>')].into_iter()
104}
105
106pub fn fat_arrow() -> impl Iterator<Item = TokenTree> {
108 [punct_joint('='), punct('>')].into_iter()
109}
110
111#[allow(dead_code)]
113pub fn generics(inner: impl IntoIterator<Item = TokenTree>) -> Vec<TokenTree> {
114 let mut tokens = vec![punct('<')];
115 tokens.extend(inner);
116 tokens.push(punct('>'));
117 tokens
118}
119
120#[allow(dead_code)]
122pub fn extend(tokens: &mut Vec<TokenTree>, iter: impl IntoIterator<Item = TokenTree>) {
123 tokens.extend(iter);
124}
125
126pub fn compile_error(message: &str) -> TokenStream {
128 let tokens = vec![ident("compile_error"), punct('!'), parens([literal_str(message)])];
129 tokens.into_iter().collect()
130}