diff options
| author | Laurenz <laurmaedje@gmail.com> | 2023-03-08 10:43:03 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2023-03-08 10:44:24 +0100 |
| commit | 1b2b53ecb91a9bd7fb3493e471ae03cd142a7c03 (patch) | |
| tree | 682124c2343db9491c84bddbdca026c676f220c6 /macros | |
| parent | 25b5bd117529cd04bb789e1988eb3a3db8025a0e (diff) | |
Require font to be a named argument
Diffstat (limited to 'macros')
| -rw-r--r-- | macros/src/func.rs | 28 |
1 files changed, 20 insertions, 8 deletions
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<TokenStream> { - 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<TokenStream> { + 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),*] |
