Skip to main content

modkit_odata_macros/
lib.rs

1//! # modkit-odata-macros
2//!
3//! Procedural macros for `OData` protocol types and schemas.
4//!
5//! This crate provides derive macros for generating OData-related implementations:
6//! - `ODataFilterable`: Generate `FilterField` enum for server-side type-safe filtering
7//! - `ODataSchema`: Generate `Schema` trait impl for client-side query building
8//!
9//! These macros generate code referencing `modkit-odata` types and are independent
10//! of database or HTTP framework concerns.
11
12#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
13
14use proc_macro::TokenStream;
15use proc_macro_error2::proc_macro_error;
16use syn::{DeriveInput, parse_macro_input};
17
18mod odata_filterable;
19mod odata_schema;
20
21/// Derive macro for implementing type-safe `OData` filtering on DTOs.
22///
23/// Generates a `FilterField` enum implementing `modkit_odata::filter::FilterField`.
24/// This enables type-safe field references in `OData` filter expressions.
25///
26/// # Example
27///
28/// ```ignore
29/// use modkit_odata_macros::ODataFilterable;
30///
31/// #[derive(ODataFilterable)]
32/// pub struct UserQuery {
33///     #[odata(filter(kind = "Uuid"))]
34///     pub id: uuid::Uuid,
35///     #[odata(filter(kind = "String"))]
36///     pub email: String,
37/// }
38/// ```
39#[proc_macro_derive(ODataFilterable, attributes(odata))]
40#[proc_macro_error]
41pub fn derive_odata_filterable(input: TokenStream) -> TokenStream {
42    let input = parse_macro_input!(input as DeriveInput);
43    odata_filterable::expand_derive_odata_filterable(input).into()
44}
45
46/// Derive macro for implementing `OData` schema for client-side query building.
47///
48/// Generates a `Schema` trait impl and field enum for building type-safe queries.
49///
50/// # Example
51///
52/// ```ignore
53/// use modkit_odata_macros::ODataSchema;
54///
55/// #[derive(ODataSchema)]
56/// pub struct User {
57///     pub id: uuid::Uuid,
58///     pub email: String,
59/// }
60/// ```
61#[proc_macro_derive(ODataSchema, attributes(odata))]
62#[proc_macro_error]
63pub fn derive_odata_schema(input: TokenStream) -> TokenStream {
64    let input = parse_macro_input!(input as DeriveInput);
65    odata_schema::expand_derive_odata_schema(&input).into()
66}