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