1mod ast;
33mod codegen;
34mod parser;
35
36use proc_macro::TokenStream;
37use syn::{Result, spanned::Spanned};
38
39use crate::codegen::generate_runtime_code;
40use crate::parser::parse_basic_program;
41
42#[proc_macro]
46pub fn basic(input: TokenStream) -> TokenStream {
47 match expand_from_lit(input) {
48 Ok(ts) => ts.into(),
49 Err(e) => e.to_compile_error().into(),
50 }
51}
52
53fn expand_from_lit(input: TokenStream) -> Result<proc_macro2::TokenStream> {
54 let expr: syn::Expr = syn::parse(input)?;
55
56 let lit = match expr {
57 syn::Expr::Lit(syn::ExprLit {
58 lit: syn::Lit::Str(lit),
59 ..
60 }) => lit,
61 other => return Err(syn::Error::new(other.span(), "expected a string literal")),
62 };
63
64 expand_basic(&lit)
65}
66
67fn expand_basic(src: &syn::LitStr) -> Result<proc_macro2::TokenStream> {
68 let code = src.value();
69 let stmts = parse_basic_program(&code, src)?;
70 generate_runtime_code(stmts, src)
71}