rsnark_macros/lib.rs
1use proc_macro::TokenStream;
2use syn::{ItemStruct, parse_macro_input};
3
4mod derive_circuit;
5
6/// Circuit attribute macro for defining zero-knowledge circuits.
7///
8/// This macro automatically generates the necessary implementations for circuit structures,
9/// including witness handling, variable management, and circuit element traits.
10///
11/// # Features
12///
13/// - **Automatic witness generation**: Creates corresponding witness structures
14/// - **Public/private field handling**: Respects Rust visibility modifiers
15/// - **Generic support**: Works with generic circuit structures
16/// - **Type safety**: Ensures proper variable and witness type relationships
17///
18/// # Usage
19///
20/// ## Basic Circuit
21/// ```rust,ignore
22/// use rsnark::circuit;
23///
24/// #[circuit]
25/// pub struct MyCircuit {
26/// a: u32, // private input
27/// pub b: u32, // public input
28/// }
29/// ```
30///
31/// ## Generic Circuit
32/// ```rust,ignore
33/// #[circuit]
34/// pub struct GenericCircuit<T> {
35/// input: T,
36/// pub output: T,
37/// }
38/// ```
39///
40/// # Field Visibility
41///
42/// - Fields **without** `pub` become **private inputs**
43/// - Fields **with** `pub` become **public inputs**
44///
45/// # Requirements
46///
47/// For generic circuits, type parameters must implement appropriate circuit traits.
48/// See the documentation for specific trait bounds required.
49#[proc_macro_attribute]
50pub fn circuit(_: TokenStream, input: TokenStream) -> TokenStream {
51 let input = parse_macro_input!(input as ItemStruct);
52
53 match derive_circuit::generate_circuit_impl(&input) {
54 Ok(tokens) => tokens,
55 Err(err) => err.to_compile_error().into(),
56 }
57}