rtic_syntax/parse/
idle.rs

1use proc_macro2::TokenStream as TokenStream2;
2use syn::{parse, ItemFn};
3
4use crate::{
5    ast::{Idle, IdleArgs},
6    parse::util,
7};
8
9impl IdleArgs {
10    pub(crate) fn parse(tokens: TokenStream2) -> parse::Result<Self> {
11        crate::parse::idle_args(tokens)
12    }
13}
14
15impl Idle {
16    pub(crate) fn parse(args: IdleArgs, item: ItemFn) -> parse::Result<Self> {
17        let valid_signature = util::check_fn_signature(&item)
18            && item.sig.inputs.len() == 1
19            && util::type_is_bottom(&item.sig.output);
20
21        let name = item.sig.ident.to_string();
22
23        if valid_signature {
24            if let Some((context, Ok(rest))) = util::parse_inputs(item.sig.inputs, &name) {
25                if rest.is_empty() {
26                    return Ok(Idle {
27                        args,
28                        attrs: item.attrs,
29                        context,
30                        name: item.sig.ident,
31                        stmts: item.block.stmts,
32                    });
33                }
34            }
35        }
36
37        Err(parse::Error::new(
38            item.sig.ident.span(),
39            format!(
40                "this `#[idle]` function must have signature `fn({}::Context) -> !`",
41                name
42            ),
43        ))
44    }
45}