bomboni_request_derive/parse/
mod.rs

1#![allow(clippy::option_if_let_else)]
2
3use darling::ast::Data;
4use options::ParseOptions;
5use proc_macro2::TokenStream;
6use quote::quote;
7use syn::DeriveInput;
8
9mod field_type_info;
10mod message;
11mod oneof;
12mod parse_serde;
13mod parse_utility;
14mod write_utility;
15
16pub mod derived_map;
17pub mod options;
18pub mod parse_resource_name;
19
20pub fn expand(input: DeriveInput) -> syn::Result<TokenStream> {
21    let options = ParseOptions::parse(&input)?;
22
23    let mut result = expand_usage(&options);
24
25    result.extend(match &options.data {
26        Data::Struct(data) => message::expand(&options, &data.fields)?,
27        Data::Enum(data) => oneof::expand(&options, data)?,
28    });
29
30    result.extend(parse_serde::expand(&options)?);
31
32    Ok(quote! {
33        #[doc(hidden)]
34        #[allow(unused_imports, unused_must_use, non_upper_case_globals, unused_attributes, unused_qualifications)]
35        const _ : () = {
36            #result
37        };
38    })
39}
40
41fn expand_usage(options: &ParseOptions) -> TokenStream {
42    let mut result = quote!();
43
44    result.extend(if let Some(path) = options.serde_crate.as_ref() {
45        quote! {
46            use #path as _serde;
47        }
48    } else {
49        quote! {
50            #[allow(unused_extern_crates, clippy::useless_attribute)]
51            extern crate serde as _serde;
52        }
53    });
54
55    let use_prost = if let Some(path) = options.prost_crate.as_ref() {
56        quote!(#path)
57    } else {
58        quote!(::prost::Name)
59    };
60
61    let (mut use_proto, mut use_request) = if let Some(path) = options.bomboni_crate.as_ref() {
62        (quote!(#path::proto), quote!(#path::request))
63    } else if cfg!(feature = "root-crate") {
64        (quote!(bomboni::proto), quote!(bomboni::request))
65    } else {
66        (quote!(bomboni_proto), quote!(bomboni_request))
67    };
68
69    if let Some(path) = options.bomboni_proto_crate.as_ref() {
70        use_proto = quote!(#path);
71    }
72    if let Some(path) = options.bomboni_request_crate.as_ref() {
73        use_request = quote!(#path);
74    }
75
76    result.extend(quote! {
77        use #use_prost;
78        use #use_proto::google::protobuf::{
79            BoolValue, DoubleValue, FloatValue, Int32Value, Int64Value, StringValue, Timestamp,
80            UInt32Value, UInt64Value,
81        };
82        use #use_request::{
83            error::{CommonError, PathError, PathErrorStep, RequestError, RequestResult},
84            filter::Filter,
85            ordering::{Ordering, OrderingDirection, OrderingTerm},
86            query::{
87                list::{ListQuery, ListQueryBuilder, ListQueryConfig},
88                page_token::{plain::PlainPageTokenBuilder, FilterPageToken, PageTokenBuilder},
89                search::{SearchQuery, SearchQueryBuilder, SearchQueryConfig},
90            },
91            parse::{RequestParse, RequestParseInto},
92        };
93    });
94
95    result
96}