Skip to main content

apollo_errors_derive/
lib.rs

1//! Derive macro implementation for the `apollo-errors` crate.
2//!
3//! This crate should not be used directly. Use `apollo_errors` instead,
4//! which re-exports everything you need.
5
6use proc_macro::TokenStream;
7use syn::{DeriveInput, parse_macro_input};
8
9mod codegen;
10mod ir;
11mod parse;
12
13#[proc_macro_derive(
14    Error,
15    attributes(
16        error,
17        diagnostic,
18        extension,
19        http_status,
20        http_header,
21        jsonrpc_code,
22        source,
23        from
24    )
25)]
26pub fn derive_error(input: TokenStream) -> TokenStream {
27    let input = parse_macro_input!(input as DeriveInput);
28
29    // Data flow: Parse->IR->Codegen
30    match parse::parse_error_derive(input) {
31        Ok(ir) => {
32            let tokens = codegen::generate(&ir);
33            TokenStream::from(tokens)
34        }
35        Err(err) => err.to_compile_error().into(),
36    }
37}
38
39#[cfg(test)]
40mod tests;