oxide_macros/
lib.rs

1#![feature(box_patterns)]
2/* lib.rs
3 *
4 * Developed by Tim Walls <tim.walls@snowgoons.com>
5 * Copyright (c) All Rights Reserved, Tim Walls
6 */
7//! AVRoxide procedural macros
8
9// Imports ===================================================================
10extern crate proc_macro;
11use proc_macro::TokenStream;
12
13mod entrypoint;
14mod persist;
15mod interrupt;
16
17// Declarations ==============================================================
18#[proc_macro_attribute]
19#[cfg(not(test))]
20pub fn main(args: TokenStream, item: TokenStream) -> TokenStream {
21  entrypoint::generate_main(args,item)
22}
23
24#[proc_macro_derive(Persist, attributes(persist))]
25pub fn derive_persist(item: TokenStream) -> TokenStream {
26  persist::derive_persist(item)
27}
28
29#[proc_macro_attribute]
30pub fn interrupt(args: TokenStream, item: TokenStream) -> TokenStream {
31  interrupt::generate_interrupt(args,item)
32}
33
34// Code ======================================================================
35fn parse_string_literal(string: syn::Lit) -> Result<String,syn::Error> {
36  match string {
37    syn::Lit::Str(s) => Ok(s.value()),
38    syn::Lit::Verbatim(s) => Ok(s.to_string()),
39    _ => Err(syn::Error::new_spanned(string, "Cannot parse value as string"))
40  }
41}
42
43fn parse_usize_literal(literal: syn::Lit) -> Result<usize,syn::Error> {
44  match literal {
45    syn::Lit::Int(litint) => {
46      Ok(litint.base10_parse::<usize>()?)
47    },
48    _ => Err(syn::Error::new_spanned(literal, "Cannot parse value as usize"))
49  }
50}
51
52
53
54// Tests =====================================================================