syntaxfmt_macros/
lib.rs

1use std::fmt::Display;
2
3use proc_macro::TokenStream;
4use quote::ToTokens;
5use syn::{DeriveInput, Error as SynError, Result as SynResult, parse_macro_input};
6
7use crate::intermediate::ty::SyntaxType;
8
9mod attributes;
10mod intermediate;
11
12fn syn_err<T: ToTokens, U: Display, R>(tokens: T, message: U) -> SynResult<R> {
13    Err(SynError::new_spanned(tokens, message))
14}
15
16#[proc_macro_derive(SyntaxFmt, attributes(syntax, syntax_else))]
17pub fn derive_syntax_fmt(input: TokenStream) -> TokenStream {
18    let input = parse_macro_input!(input as DeriveInput);
19
20    let ty = match SyntaxType::from_derive_input(&mut Vec::new(), &input) {
21        Ok(ty) => ty,
22        Err(e) => return e.to_compile_error().into(),
23    };
24
25    ty.to_token_stream().into()
26}