api-macro: match the item type early

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
Wolfgang Bumiller 2019-11-28 09:16:34 +01:00
parent 1ae127b63a
commit 74ed56957d
2 changed files with 6 additions and 4 deletions

View File

@ -263,6 +263,10 @@ impl SchemaArray {
/// See the top level macro documentation for a complete example.
pub(crate) fn api(attr: TokenStream, item: TokenStream) -> Result<TokenStream, Error> {
let attribs = JSONObject::parse_inner.parse2(attr)?;
let item: syn::Item = syn::parse2(item)?;
method::handle_method(attribs, item)
match item {
syn::Item::Fn(func) => method::handle_method(attribs, func),
_ => bail!(item => "api macro only works on functions"),
}
}

View File

@ -15,9 +15,7 @@ use crate::util::{BareAssignment, JSONObject, SimpleIdent};
/// with an `#[api]` attribute and produce a `const ApiMethod` named after the function.
///
/// See the top level macro documentation for a complete example.
pub fn handle_method(mut attribs: JSONObject, item: TokenStream) -> Result<TokenStream, Error> {
let mut func: syn::ItemFn = syn::parse2(item)?;
pub fn handle_method(mut attribs: JSONObject, mut func: syn::ItemFn) -> Result<TokenStream, Error> {
let mut input_schema: Schema = attribs
.remove_required_element("input")?
.into_object("input schema definition")?