protoflow_derive/
lib.rs

1// This is free and unencumbered software released into the public domain.
2
3//! This crate provides Protoflow's derive macros.
4//!
5//! ```edition2021
6//! # use protoflow_derive::{Block, FunctionBlock, Subsystem, System};
7//! ```
8
9#![deny(unsafe_code)]
10
11extern crate proc_macro;
12
13mod derives;
14mod meta;
15pub(crate) mod util;
16
17use proc_macro::TokenStream;
18use syn::{parse_macro_input, DeriveInput};
19
20#[proc_macro_derive(Block, attributes(input, output, parameter, state))]
21pub fn derive_block(input: TokenStream) -> TokenStream {
22    let input: DeriveInput = parse_macro_input!(input);
23    derives::expand_derive_block(&input)
24        .unwrap_or_else(syn::Error::into_compile_error)
25        .into()
26}
27
28#[proc_macro_derive(FunctionBlock, attributes())]
29pub fn derive_function_block(input: TokenStream) -> TokenStream {
30    let input: DeriveInput = parse_macro_input!(input);
31    derives::expand_derive_function_block(&input)
32        .unwrap_or_else(syn::Error::into_compile_error)
33        .into()
34}
35
36#[proc_macro_derive(Subsystem, attributes(block))]
37pub fn derive_subsystem(input: TokenStream) -> TokenStream {
38    let input: DeriveInput = parse_macro_input!(input);
39    derives::expand_derive_system(&input)
40        .unwrap_or_else(syn::Error::into_compile_error)
41        .into()
42}
43
44#[proc_macro_derive(System, attributes(block))]
45pub fn derive_system(input: TokenStream) -> TokenStream {
46    let input: DeriveInput = parse_macro_input!(input);
47    derives::expand_derive_system(&input)
48        .unwrap_or_else(syn::Error::into_compile_error)
49        .into()
50}