From 1b2b53ecb91a9bd7fb3493e471ae03cd142a7c03 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Wed, 8 Mar 2023 10:43:03 +0100 Subject: Require font to be a named argument --- macros/src/func.rs | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) (limited to 'macros') diff --git a/macros/src/func.rs b/macros/src/func.rs index 01c3ca0e..9889b3ae 100644 --- a/macros/src/func.rs +++ b/macros/src/func.rs @@ -1,22 +1,34 @@ use super::*; /// Expand the `#[func]` macro. -pub fn func(item: syn::Item) -> Result { - let mut docs = match &item { - syn::Item::Struct(item) => documentation(&item.attrs), - syn::Item::Enum(item) => documentation(&item.attrs), - syn::Item::Fn(item) => documentation(&item.attrs), - _ => String::new(), +pub fn func(mut item: syn::Item) -> Result { + let attrs = match &mut item { + syn::Item::Struct(item) => &mut item.attrs, + syn::Item::Fn(item) => &mut item.attrs, + _ => bail!(item, "expected struct or fn"), }; + let docs = documentation(&attrs); + + let mut lines: Vec<_> = docs.lines().collect(); + let Some(category) = lines.pop().and_then(|s| s.strip_prefix("Category: ")) else { + bail!(item, "expected category"); + }; + let Some(display) = lines.pop().and_then(|s| s.strip_prefix("Display: ")) else { + bail!(item, "expected display name"); + }; + + let mut docs = lines.join("\n"); let (params, returns) = params(&mut docs)?; let docs = docs.trim(); + attrs.retain(|attr| !attr.path.is_ident("doc")); + attrs.push(parse_quote! { #[doc = #docs] }); let info = quote! { ::typst::eval::FuncInfo { name, - display: "TODO", - category: "TODO", + display: #display, + category: #category, docs: #docs, params: ::std::vec![#(#params),*], returns: ::std::vec![#(#returns),*] -- cgit v1.2.3