Skip to main content

queryweave_derive/
lib.rs

1//! The `queryweave` derives, under the default conventions.
2//!
3//! Each derive forwards to its function in `queryweave-codegen` with
4//! `DefaultConventions`; see there for what each one generates. A crate
5//! wanting other naming rules or runtime paths writes its own proc-macro crate
6//! calling those functions with its own conventions.
7
8use proc_macro::TokenStream;
9use queryweave_codegen::conventions::DefaultConventions;
10
11/// The filtering, sorting and paging types of a root model, or of a struct
12/// mirroring a model (`#[filters(mirrors = path)]`: a root model, or another
13/// mirror); see `queryweave_codegen::filters`.
14#[proc_macro_derive(
15    Filters,
16    attributes(queryweave, filter, sortable, filters, equivalent_field)
17)]
18pub fn derive_filters(input: TokenStream) -> TokenStream {
19    queryweave_codegen::filters::<DefaultConventions>(input.into()).into()
20}
21
22#[cfg(feature = "merge-patch")]
23/// Merge patching a model with its merge patch model
24/// (`#[merge_patch(patch = path)]`); see `queryweave_codegen::merge_patch`.
25#[proc_macro_derive(MergePatch, attributes(queryweave, merge_patch))]
26pub fn derive_merge_patch(input: TokenStream) -> TokenStream {
27    queryweave_codegen::merge_patch::<DefaultConventions>(input.into()).into()
28}
29
30#[cfg(feature = "merge-patch")]
31/// The nullable (`Option<Option<T>>`) fields of a merge patch model; see
32/// `queryweave_codegen::merge_patch_nullable_fields`.
33#[proc_macro_derive(MergePatchNullableFields, attributes(queryweave, merge_patch))]
34pub fn derive_merge_patch_nullable_fields(input: TokenStream) -> TokenStream {
35    queryweave_codegen::merge_patch_nullable_fields::<DefaultConventions>(input.into()).into()
36}
37
38/// `queryweave::RawValue` for a value object; see
39/// `queryweave_codegen::raw_value`.
40#[proc_macro_derive(RawValue, attributes(queryweave))]
41pub fn derive_raw_value(input: TokenStream) -> TokenStream {
42    queryweave_codegen::raw_value::<DefaultConventions>(input.into()).into()
43}
44
45#[cfg(feature = "merge-patch")]
46/// The non-nullable validation of a merge patch DTO mirroring a domain merge
47/// patch model; see `queryweave_codegen::validate_non_nullable`.
48///
49/// `#[validate_non_nullable(mirrors = path)]`, plus the validation library's
50/// flag, e.g. `validator`.
51#[proc_macro_derive(
52    ValidateNonNullable,
53    attributes(queryweave, validate_non_nullable, equivalent_field)
54)]
55pub fn derive_validate_non_nullable(input: TokenStream) -> TokenStream {
56    queryweave_codegen::validate_non_nullable::<DefaultConventions>(input.into()).into()
57}
58
59/// The SQL of a wrapper of a domain query model; see
60/// `queryweave_codegen::append_to_query`.
61#[proc_macro_derive(AppendToQuery, attributes(queryweave, append_to_query))]
62pub fn derive_append_to_query(input: TokenStream) -> TokenStream {
63    queryweave_codegen::append_to_query::<DefaultConventions>(input.into()).into()
64}
65
66/// The SQL of a wrapper of a domain filter-options model; see
67/// `queryweave_codegen::append_conditions`.
68#[proc_macro_derive(AppendConditions, attributes(queryweave, append_conditions))]
69pub fn derive_append_conditions(input: TokenStream) -> TokenStream {
70    queryweave_codegen::append_conditions::<DefaultConventions>(input.into()).into()
71}
72
73/// `queryweave_sql::Columns` for a `sqlx` entity
74/// (`#[columns(model = Model)]`); see `queryweave_codegen::columns`.
75#[proc_macro_derive(Columns, attributes(queryweave, columns, domain_field))]
76pub fn derive_columns(input: TokenStream) -> TokenStream {
77    queryweave_codegen::columns::<DefaultConventions>(input.into()).into()
78}