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}