reifydb_macro/lib.rs
1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
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#![cfg_attr(not(debug_assertions), deny(warnings))]
12//! ```ignore
13//! use reifydb_type::FromFrame;
14//!
15//! #[derive(FromFrame)]
16//! struct User {
17//! id: i64,
18//! name: String,
19//! #[frame(column = "created_at")]
20//! timestamp: i64,
21//! #[frame(optional)]
22//! email: Option<String>,
23//! }
24//!
25//! let users: Vec<User> = frame.try_into()?;
26//! ```
27
28use proc_macro::TokenStream;
29use reifydb_macro_impl::derive_from_frame_with_crate;
30
31/// Derives `FromFrame` for a struct, enabling deserialization from a Frame.
32///
33/// This derive generates code that references types from `reifydb_type`.
34/// For code that references `reifydb` or `reifydb_client`, use the
35/// `FromFrame` derive from those crates instead.
36///
37/// # Attributes
38///
39/// - `#[frame(column = "name")]` - Use a different column name than the field name
40/// - `#[frame(optional)]` - Field is optional; missing columns or Undefined values become None
41/// - `#[frame(coerce)]` - Use widening type coercion for this field
42/// - `#[frame(skip)]` - Skip this field (must implement Default)
43#[proc_macro_derive(FromFrame, attributes(frame))]
44pub fn derive_from_frame(input: TokenStream) -> TokenStream {
45 derive_from_frame_with_crate(input.into(), "reifydb_type").into()
46}