Skip to main content

mool_macros_impl/
lib.rs

1//! Internal derive implementation shared by Mool and framework wrappers.
2//!
3//! This crate is public only so proc-macro crates can reuse one implementation.
4//! Application code should depend on `mool`, not this crate.
5
6pub mod filterable;
7pub mod model;
8pub mod record;
9mod schemable;
10pub mod sql_enum;
11mod typed_handles;
12
13use proc_macro2::TokenStream;
14use quote::quote;
15use syn::{DeriveInput, LitStr};
16
17/// Resolves the runtime path used in generated DB code.
18pub fn runtime_path(input: &DeriveInput, default_path: TokenStream) -> TokenStream {
19    match db_crate_override(input) {
20        Ok(Some(path)) => path,
21        Ok(None) => default_path,
22        Err(err) => err.to_compile_error(),
23    }
24}
25
26fn db_crate_override(input: &DeriveInput) -> syn::Result<Option<TokenStream>> {
27    let mut out = None;
28    for attr in input.attrs.iter().filter(|attr| attr.path().is_ident("db")) {
29        attr.parse_nested_meta(|meta| {
30            if meta.path.is_ident("crate") {
31                let value = meta.value()?;
32                let path: LitStr = value.parse()?;
33                out = Some(path.parse()?);
34                return Ok(());
35            }
36            Err(meta.error("unsupported db attribute"))
37        })?;
38    }
39    Ok(out)
40}
41
42/// Default path used by wrapper crates that intentionally pass none.
43pub fn default_mool_path() -> TokenStream {
44    quote! { ::mool }
45}