1use proc_macro::TokenStream;
2use std::io::Write;
3
4
5fn _format(input: TokenStream) -> TokenStream {
6 let mut var_vector: Vec<String> = Vec::new();
7 let mut print_string = String::new();
8
9 let mut buffer = String::new();
10 let mut is_var: bool = false;
11 let mut first: bool = true;
12 for token in input.to_string().chars() {
13 if first {
14 if token != 'f' {
15 let mut output = "std::format!(".to_owned();
16 output.push_str(&input.to_string());
17 output.push_str(")");
18 let stream: TokenStream = output.parse().unwrap();
19 return stream
20 } else {
21 first = false;
22 continue
23 }
24 }
25 let token: String = token.to_string();
26 if token.eq("{") {
27 is_var = true;
28 print_string += "{:?}";
29 } else if token.eq("}") {
30 is_var = false;
31 var_vector.push(buffer);
32 buffer = String::new();
33 } else if is_var {
34 buffer.push_str(&token);
35 } else {
36 print_string.push_str(&token);
37 }
38 }
39
40 let mut output = "std::format!(".to_owned();
41 output.push_str(&print_string);
42 output.push_str(", ");
43 output.push_str(&var_vector.join(","));
44 output.push_str(")");
45 let stream: TokenStream = output.parse().unwrap();
46 return stream
47}
48
49
50#[proc_macro]
51pub fn format(input: TokenStream) -> TokenStream {
52 _format(input)
53}
54
55
56#[proc_macro]
57pub fn print(input: TokenStream) -> TokenStream {
58 let formated: String = _format(input).to_string();
59 let mut buffer = "std::print!(\"{}\", ".to_owned();
60 buffer.push_str(&formated);
61 buffer.push_str(")");
62 let stream: TokenStream = buffer.parse().unwrap();
63 return stream
64}
65
66
67#[proc_macro]
68pub fn println(input: TokenStream) -> TokenStream {
69 let formated: String = _format(input).to_string();
70 let mut buffer = "std::println!(\"{}\", ".to_owned();
71 buffer.push_str(&formated);
72 buffer.push_str(")");
73 let stream: TokenStream = buffer.parse().unwrap();
74 return stream
75}
76
77
78#[cfg(test)]
79mod tests {
80}