ral_macro/
lib.rs

1//! Provides macro with DSL describing register
2//! For documentation refer to [ral](https://docs.rs/ral) crate
3use proc_macro::TokenStream;
4
5use syn::parse_macro_input;
6
7use crate::register::{_Register, _RegisterWithUses};
8use crate::uses::_Uses;
9
10mod field;
11mod field_type;
12mod parse;
13mod register;
14mod render;
15mod spanned;
16mod uses;
17
18/// Macro expanding into register definition and required uses
19#[proc_macro]
20pub fn register(item: TokenStream) -> TokenStream {
21    render::render_register_with_uses(parse_macro_input!(item as _RegisterWithUses))
22        .map(TokenStream::from)
23        .unwrap_or_else(|err| TokenStream::from(err.to_compile_error()))
24}
25
26/// Macro expanding into required uses, might be useful when multiple registers to be defined in the same module
27#[proc_macro]
28pub fn register_uses(item: TokenStream) -> TokenStream {
29    TokenStream::from(render::render_uses(parse_macro_input!(item as _Uses)))
30}
31
32/// Macro expanding into register definition, might be useful when multiple registers to be defined in the same module
33#[proc_macro]
34pub fn register_definition(item: TokenStream) -> TokenStream {
35    render::render_register(parse_macro_input!(item as _Register))
36        .map(TokenStream::from)
37        .unwrap_or_else(|err| TokenStream::from(err.to_compile_error()))
38}