|
|
@ -47,7 +47,9 @@ impl Parse for ConfigField { |
|
|
|
} else if lookahead.peek(Token![async]) { |
|
|
|
input.parse::<Token![async]>()?; |
|
|
|
input.parse::<Token![:]>()?; |
|
|
|
Ok(ConfigField::Async(input.parse()?)) |
|
|
|
Ok(ConfigField::Async(AsyncConf { |
|
|
|
functions: input.parse()?, |
|
|
|
})) |
|
|
|
} else { |
|
|
|
Err(lookahead.error()) |
|
|
|
} |
|
|
@ -282,40 +284,62 @@ impl Parse for ErrorConfField { |
|
|
|
#[derive(Clone, Default, Debug)] |
|
|
|
/// Modules and funcs that have async signatures
|
|
|
|
pub struct AsyncConf { |
|
|
|
functions: HashMap<String, Vec<String>>, |
|
|
|
functions: AsyncFunctions, |
|
|
|
} |
|
|
|
|
|
|
|
#[derive(Clone, Debug)] |
|
|
|
pub enum AsyncFunctions { |
|
|
|
Some(HashMap<String, Vec<String>>), |
|
|
|
All, |
|
|
|
} |
|
|
|
impl Default for AsyncFunctions { |
|
|
|
fn default() -> Self { |
|
|
|
AsyncFunctions::Some(HashMap::default()) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
impl AsyncConf { |
|
|
|
pub fn is_async(&self, module: &str, function: &str) -> bool { |
|
|
|
self.functions |
|
|
|
.get(module) |
|
|
|
.and_then(|fs| fs.iter().find(|f| *f == function)) |
|
|
|
.is_some() |
|
|
|
match &self.functions { |
|
|
|
AsyncFunctions::Some(fs) => fs |
|
|
|
.get(module) |
|
|
|
.and_then(|fs| fs.iter().find(|f| *f == function)) |
|
|
|
.is_some(), |
|
|
|
AsyncFunctions::All => true, |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
impl Parse for AsyncConf { |
|
|
|
impl Parse for AsyncFunctions { |
|
|
|
fn parse(input: ParseStream) -> Result<Self> { |
|
|
|
let content; |
|
|
|
let _ = braced!(content in input); |
|
|
|
let items: Punctuated<AsyncConfField, Token![,]> = |
|
|
|
content.parse_terminated(Parse::parse)?; |
|
|
|
let mut functions: HashMap<String, Vec<String>> = HashMap::new(); |
|
|
|
use std::collections::hash_map::Entry; |
|
|
|
for i in items { |
|
|
|
let function_names = i |
|
|
|
.function_names |
|
|
|
.iter() |
|
|
|
.map(|i| i.to_string()) |
|
|
|
.collect::<Vec<String>>(); |
|
|
|
match functions.entry(i.module_name.to_string()) { |
|
|
|
Entry::Occupied(o) => o.into_mut().extend(function_names), |
|
|
|
Entry::Vacant(v) => { |
|
|
|
v.insert(function_names); |
|
|
|
let lookahead = input.lookahead1(); |
|
|
|
if lookahead.peek(syn::token::Brace) { |
|
|
|
let _ = braced!(content in input); |
|
|
|
let items: Punctuated<AsyncConfField, Token![,]> = |
|
|
|
content.parse_terminated(Parse::parse)?; |
|
|
|
let mut functions: HashMap<String, Vec<String>> = HashMap::new(); |
|
|
|
use std::collections::hash_map::Entry; |
|
|
|
for i in items { |
|
|
|
let function_names = i |
|
|
|
.function_names |
|
|
|
.iter() |
|
|
|
.map(|i| i.to_string()) |
|
|
|
.collect::<Vec<String>>(); |
|
|
|
match functions.entry(i.module_name.to_string()) { |
|
|
|
Entry::Occupied(o) => o.into_mut().extend(function_names), |
|
|
|
Entry::Vacant(v) => { |
|
|
|
v.insert(function_names); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
Ok(AsyncFunctions::Some(functions)) |
|
|
|
} else if lookahead.peek(Token![*]) { |
|
|
|
let _: Token![*] = input.parse().unwrap(); |
|
|
|
Ok(AsyncFunctions::All) |
|
|
|
} else { |
|
|
|
Err(lookahead.error()) |
|
|
|
} |
|
|
|
Ok(AsyncConf { functions }) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|