Skip to main content

ironsbe_derive/
lib.rs

1//! # IronSBE Derive
2//!
3//! Procedural macros for SBE message definitions.
4//!
5//! This crate provides derive macros for automatically implementing
6//! SBE encoder/decoder traits.
7
8use proc_macro::TokenStream;
9use quote::quote;
10use syn::{DeriveInput, parse_macro_input};
11
12/// Derives the SbeMessage trait for a struct.
13///
14/// # Example
15/// ```ignore
16/// #[derive(SbeMessage)]
17/// #[sbe(template_id = 1, block_length = 56)]
18/// struct NewOrderSingle {
19///     #[sbe(offset = 0, type = "ClOrdId")]
20///     cl_ord_id: [u8; 20],
21///     #[sbe(offset = 20, type = "Symbol")]
22///     symbol: [u8; 8],
23/// }
24/// ```
25#[proc_macro_derive(SbeMessage, attributes(sbe))]
26pub fn derive_sbe_message(input: TokenStream) -> TokenStream {
27    let input = parse_macro_input!(input as DeriveInput);
28    let name = &input.ident;
29
30    // For now, generate a simple implementation
31    // Full implementation would parse attributes and generate field accessors
32    let expanded = quote! {
33        impl #name {
34            /// Returns the template ID for this message.
35            pub const fn template_id() -> u16 {
36                0 // Would be parsed from attribute
37            }
38        }
39    };
40
41    TokenStream::from(expanded)
42}
43
44/// Derives field accessors for SBE fields.
45#[proc_macro_derive(SbeField, attributes(sbe))]
46pub fn derive_sbe_field(input: TokenStream) -> TokenStream {
47    let input = parse_macro_input!(input as DeriveInput);
48    let _name = &input.ident;
49
50    // Placeholder implementation
51    let expanded = quote! {};
52
53    TokenStream::from(expanded)
54}