Generate function code.
(
metadata: FnMetadata,
item_stream: TokenStream,
from_fn: bool,
)
| 137 | |
| 138 | /// Generate function code. |
| 139 | pub 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 | }); |
no test coverage detected