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}