1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use proc_macro2::TokenStream;
use quote::{quote, ToTokens};

mod ast;
mod encode;
mod to_tokens;

pub fn generate_datafrog(input: TokenStream) -> TokenStream {
    let parsed_program = match syn::parse2(input) {
        Ok(program) => program,
        Err(err) => {
            let tokens = TokenStream::from(err.to_compile_error());
            return quote! { {#tokens }};
        }
    };
    let typechecked_program = match crate::typechecker::typecheck(parsed_program) {
        Ok(program) => program,
        Err(err) => {
            let tokens = TokenStream::from(err.to_syn_error().to_compile_error());
            return quote! { {#tokens }};
        }
    };
    let encoded_program = encode::encode(typechecked_program);
    encoded_program.to_token_stream()
}