bomboni_request_derive/parse/
mod.rs1#![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}