reifydb_macro/lib.rs
1// Copyright (c) reifydb.com 2025
2// This file is licensed under the MIT, see license.md file
3
4//! Derive macros for ReifyDB.
5//!
6//! This crate provides the `#[derive(FromFrame)]` macro for ergonomic
7//! deserialization of Frame data into Rust structs.
8//!
9//! # Example
10//!
11//! ```ignore
12//! use reifydb_type::FromFrame;
13//!
14//! #[derive(FromFrame)]
15//! struct User {
16//! id: i64,
17//! name: String,
18//! #[frame(column = "created_at")]
19//! timestamp: i64,
20//! #[frame(optional)]
21//! email: Option<String>,
22//! }
23//!
24//! let users: Vec<User> = frame.try_into()?;
25//! ```
26
27use proc_macro::TokenStream;
28
29/// Derives `FromFrame` for a struct, enabling deserialization from a Frame.
30///
31/// This derive generates code that references types from `reifydb_type`.
32/// For code that references `reifydb` or `reifydb_client`, use the
33/// `FromFrame` derive from those crates instead.
34///
35/// # Attributes
36///
37/// - `#[frame(column = "name")]` - Use a different column name than the field name
38/// - `#[frame(optional)]` - Field is optional; missing columns or Undefined values become None
39/// - `#[frame(coerce)]` - Use widening type coercion for this field
40/// - `#[frame(skip)]` - Skip this field (must implement Default)
41#[proc_macro_derive(FromFrame, attributes(frame))]
42pub fn derive_from_frame(input: TokenStream) -> TokenStream {
43 reifydb_macro_impl::derive_from_frame_with_crate(input.into(), "reifydb_type").into()
44}