modql_macros/lib.rs
1// region: --- Modules
2
3mod derives_field;
4mod derives_filter;
5mod utils;
6
7use crate::derives_filter::derive_filter_nodes_inner;
8use proc_macro::TokenStream;
9
10// endregion: --- Modules
11
12#[proc_macro_derive(FilterNodes, attributes(modql))]
13pub fn derive_filter_nodes(input: TokenStream) -> TokenStream {
14 derive_filter_nodes_inner(input)
15}
16
17// region: --- with-seaquery
18
19#[proc_macro_derive(Fields, attributes(field, modql))]
20pub fn derive_fields(input: TokenStream) -> TokenStream {
21 derives_field::derive_fields_inner(input)
22}
23
24/// Implements `From<T> for sea_query::Value` and `sea_query::Nullable for T`
25/// where T is the struct or enum annotated with `#[derive(Field)]` for simple
26/// tuple structs or enums.
27///
28/// For more complex types, implement both of these traits for the type.
29///
30/// For example:
31///
32/// - On simple type and single element tuple struct
33/// ```rust,norun
34/// #[derive(modql::field::Field)]
35/// pub struct EpochTime(pub(in crate::time) i64);
36/// ```
37/// Will generate something like
38/// ```rust,norun
39/// impl From<EpochTime> for sea_query::Value {
40/// fn from(value: EpochTime) -> Self {
41/// Self::BigInt(Some(value.0))
42/// }
43/// }
44/// impl sea_query::Nullable for EpochTime {
45/// fn null() -> sea_query::Value {
46/// sea_query::Value::BigInt(None)
47/// }
48/// }
49/// ```
50/// Notes:
51/// - Supports only primitive types (no array yet)
52/// - Supports only one tuple field.
53///
54/// - On Simple enum (plain variant only).
55/// ```rust,norun
56/// #[derive(modql::field::SeaFieldValue)]
57/// pub enum Kind {
58/// Md,
59/// Pdf,
60/// Unknown,
61/// }
62/// ```
63/// Notes:
64/// - Will be treated a sea_query::Value::String with the name of the variant.
65/// - No rename for now.
66#[cfg(feature = "with-sea-query")]
67#[proc_macro_derive(SeaFieldValue)]
68pub fn derive_field_sea_value(input: TokenStream) -> TokenStream {
69 derives_field::derive_field_sea_value_inner(input)
70}
71
72// endregion: --- with-seaquery
73
74// region: --- with-rusqlite
75
76#[cfg(feature = "with-rusqlite")]
77mod derives_rusqlite;
78
79#[cfg(feature = "with-rusqlite")]
80#[proc_macro_derive(SqliteFromRow, attributes(field, fields))]
81pub fn derive_sqlite_from_row(input: TokenStream) -> TokenStream {
82 derives_rusqlite::derive_sqlite_from_row_inner(input)
83}
84
85/// Will implement the `rusqlite::types::FromSql` for the annotated type.
86///
87/// For example:
88///
89/// - For simple enum (with variant name only)
90/// ```rust,norun
91/// pub enum Kind {
92/// Md,
93/// Pdf,
94/// Unknown,
95/// }
96/// ```
97/// Will generate something like:
98/// ```rust,norun
99/// impl rusqlite::types::FromSql for Kind {
100/// fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult<Self> {
101/// let txt: String = rusqlite::types::FromSql::column_result(value)?;
102/// match txt.as_str() {
103/// "Md" => Ok(Kind::Md),
104/// "Pdf" => Ok(Kind::Pdf),
105/// "Unknown" => Ok(Kind::Unknown),
106/// _ => Err(rusqlite::types::FromSqlError::Other(
107/// format!("Invalid enum variant string '{}'", txt).into(),
108/// )),
109/// }
110/// }
111/// }
112/// ```
113///
114/// - For simple tuple struct (one value that already implement the FromSqlt)
115/// ```rust,norun
116/// #[derive(modql::FromSqliteType)]
117/// pub struct EpochTime(i64);
118/// ```
119/// Will generate something like:
120/// ```rust,norun
121/// impl rusqlite::types::FromSql for EpochTime {
122/// fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult<Self> {
123/// let val = i64::column_result(value)?;
124/// Ok(EpochTime(val))
125/// }
126/// }
127/// ````
128///
129#[cfg(feature = "with-rusqlite")]
130#[proc_macro_derive(SqliteFromValue)]
131pub fn derive_sqlite_from_value(input: TokenStream) -> TokenStream {
132 derives_rusqlite::derive_from_sqlite_value_inner(input)
133}
134
135#[cfg(feature = "with-rusqlite")]
136#[proc_macro_derive(SqliteToValue)]
137pub fn derive_sqlite_to_value(input: TokenStream) -> TokenStream {
138 derives_rusqlite::derive_sqlite_to_value_inner(input)
139}
140
141// endregion: --- with-rusqlite
142
143// region: --- with-rusqlite Deprecated
144
145#[deprecated(note = "use SqliteFromRow")]
146#[cfg(feature = "with-rusqlite")]
147#[proc_macro_derive(FromSqliteRow, attributes(field, fields))]
148pub fn derive_sqlite_from_row_deprecated(input: TokenStream) -> TokenStream {
149 derives_rusqlite::derive_sqlite_from_row_inner(input)
150}
151
152#[deprecated(note = "use SqliteFromValue")]
153#[cfg(feature = "with-rusqlite")]
154#[proc_macro_derive(FromSqliteValue)]
155pub fn derive_sqlite_from_value_deprecated(input: TokenStream) -> TokenStream {
156 derives_rusqlite::derive_from_sqlite_value_inner(input)
157}
158
159#[deprecated(note = "use SqliteToValue")]
160#[cfg(feature = "with-rusqlite")]
161#[proc_macro_derive(ToSqliteValue)]
162pub fn derive_sqlite_to_value_depcreated(input: TokenStream) -> TokenStream {
163 derives_rusqlite::derive_sqlite_to_value_inner(input)
164}
165// endregion: --- with-rusqlite Deprecated