tensorism_gen/
lib.rs

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}