MCPcopy Create free account
hub / github.com/dxx/feignhttp / fn_impl

Function fn_impl

codegen/src/func.rs:139–406  ·  view source on GitHub ↗

Generate function code.

(
    metadata: FnMetadata,
    item_stream: TokenStream,
    from_fn: bool,
)

Source from the content-addressed store, hash-verified

137
138/// Generate function code.
139pub fn fn_impl(
140 metadata: FnMetadata,
141 item_stream: TokenStream,
142 from_fn: bool,
143) -> syn::Result<proc_macro2::TokenStream> {
144 let url = metadata.url;
145 let method = metadata.method.to_str();
146 let meta_map = metadata.meta_map;
147
148 let mut item_fn = syn::parse::<syn::ItemFn>(item_stream)?;
149 let sig = &mut item_fn.sig;
150
151 let mut config_keys = Vec::new();
152 let mut config_values = Vec::new();
153 for (k, v) in meta_map.iter() {
154 let key = k.as_str();
155 if from_fn == true && (key == "connect_timeout" || key == "read_timeout") {
156 return Err(syn::Error::new_spanned(
157 sig.fn_token,
158 format!("`{}` is not support, please use custom config instead", key),
159 ));
160 }
161 if !CONFIG_KEYS.contains(&k.as_str()) {
162 continue;
163 }
164 config_keys.push(k);
165 config_values.push(v);
166 }
167
168 let (header_keys, header_values) = match meta_map.get("headers") {
169 Some(val) => parse_header_values(&val)?,
170 None => (vec![], vec![]),
171 };
172
173 let asyncness = &sig.asyncness;
174 if asyncness.is_none() {
175 return Err(syn::Error::new_spanned(
176 sig.fn_token,
177 "only support async fn",
178 ));
179 }
180
181 let vis = &item_fn.vis;
182 let args = parse_args_from_sig(sig)?;
183
184 let (param_names, param_vars) = find_type_name_vars(&args, ArgType::PARAM, |_fn_arg| true);
185
186 let (path_names, path_vars) = find_type_name_vars(&args, ArgType::PATH, |_fn_arg| true);
187
188 let (header_names, header_vars) =
189 find_type_name_vars(&args, ArgType::HEADER, |fn_arg| !filter_struct(fn_arg));
190
191 let (_header_struct_names, header_struct_vars) =
192 find_type_name_vars(&args, ArgType::HEADER, |fn_arg| filter_struct(fn_arg));
193
194 let (query_names, query_vars) = find_type_name_vars(&args, ArgType::QUERY, |fn_arg| {
195 !filter_query_array(fn_arg) && !filter_struct(fn_arg)
196 });

Callers 2

http_implFunction · 0.85
fn_to_streams_for_traitFunction · 0.85

Calls 15

parse_args_from_sigFunction · 0.85
get_multipart_fn_callFunction · 0.85
parse_return_typeFunction · 0.85
to_strMethod · 0.80
parse_header_valuesFunction · 0.70
find_type_name_varsFunction · 0.70
filter_structFunction · 0.70
filter_query_arrayFunction · 0.70
find_type_varsFunction · 0.70
find_arg_typesFunction · 0.70
is_support_typesFunction · 0.70

Tested by

no test coverage detected