1#![feature(proc_macro_quote)]
2#![feature(extend_one)]
3
4extern crate proc_macro;
5extern crate syn;
6#[macro_use]
7extern crate quote;
8
9use proc_macro2::{Literal, TokenStream, TokenTree};
10
11mod parsing;
12mod sequentialization;
13mod types;
14
15use parsing::parse;
16use sequentialization::sequentialize;
17
18fn simplify(text: &String) -> String {
19 let mut result = String::new();
20 text.split('\n').map(|s| s.trim()).for_each(|s| {
21 result.extend_one(s);
22 result.extend_one(' ')
23 });
24 result
25}
26
27#[proc_macro]
28pub fn make(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
29 match parse(input) {
30 Err(invalid_stream) => invalid_stream.into(),
31 Ok((sequence, index_use)) => sequentialize(sequence, index_use).into(),
32 }
33}
34
35#[proc_macro]
36pub fn format_for_make(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
37 match parse(input) {
38 Err(invalid_stream) => invalid_stream.into(),
39 Ok((sequence, index_use)) => {
40 let output = sequentialize(sequence, index_use);
41 let string = simplify(&output.to_string());
42 let mut output = TokenStream::new();
43 output.extend_one(TokenTree::Literal(Literal::string(string.as_str())));
44 output.into()
45 }
46 }
47}