rtfm-syntax 0.4.0

The Real Time for The Masses (RTFM) meta language
Documentation
use syn::{parse, ForeignItemFn, Ident};

use crate::{ast::ExternInterrupt, parse::util, Core};

impl ExternInterrupt {
    pub(crate) fn parse(
        item: ForeignItemFn,
        cores: u8,
    ) -> parse::Result<(Core, Ident, ExternInterrupt)> {
        let valid_signature = util::check_foreign_fn_signature(&item)
            && item.sig.inputs.is_empty()
            && util::type_is_unit(&item.sig.output);

        if !valid_signature {
            return Err(parse::Error::new(
                item.sig.ident.span(),
                "extern interrupts must have type signature `fn()`",
            ));
        }

        let (core, attrs) = if cores > 1 {
            util::extract_core(item.attrs, cores, item.sig.ident.span())?
        } else {
            (0, item.attrs)
        };

        Ok((
            core,
            item.sig.ident,
            ExternInterrupt {
                attrs,
                _extensible: (),
            },
        ))
    }
}