summaryrefslogtreecommitdiff
path: root/macros/src
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-03-08 10:43:03 +0100
committerLaurenz <laurmaedje@gmail.com>2023-03-08 10:44:24 +0100
commit1b2b53ecb91a9bd7fb3493e471ae03cd142a7c03 (patch)
tree682124c2343db9491c84bddbdca026c676f220c6 /macros/src
parent25b5bd117529cd04bb789e1988eb3a3db8025a0e (diff)
Require font to be a named argument
Diffstat (limited to 'macros/src')
-rw-r--r--macros/src/func.rs28
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),*]