rsiot_macros/
lib.rs

1mod create_signal_from_msg;
2mod derive_msg_meta;
3mod message_key;
4
5use proc_macro::TokenStream;
6use proc_macro_error::proc_macro_error;
7use quote::quote;
8use syn::{parse_macro_input, parse_str, DeriveInput};
9
10#[proc_macro_derive(MsgKey)]
11#[proc_macro_error]
12pub fn derive_msg_key(input: TokenStream) -> TokenStream {
13    let input: DeriveInput = parse_macro_input!(input as DeriveInput);
14    message_key::derive_msg_key(&input)
15}
16
17#[proc_macro_derive(MsgMeta)]
18#[proc_macro_error]
19pub fn derive_into_eav(input: TokenStream) -> TokenStream {
20    let input: DeriveInput = parse_macro_input!(input as DeriveInput);
21    derive_msg_meta::derive_msg_meta(&input)
22}
23
24/// Макрос для создания сигналов фреймворка leptos из сообщений.
25///
26/// Принимает на вход строку, содержащую вариант сообщения, без вложенного значения.
27///
28/// # Пример
29///
30/// ```rust
31/// let (signal, signal_set) = create_signal_from_msg!("Custom-ValueInstantF64");
32/// ```
33#[proc_macro]
34pub fn create_signal_from_msg(msg: TokenStream) -> TokenStream {
35    let code = create_signal_from_msg::create_signal_from_msg(&msg.to_string());
36    let code = parse_str::<syn::Expr>(&code).unwrap();
37    TokenStream::from(quote! {
38        #code
39    })
40}
41
42/// Макрос для упрощения создания сообщения
43///
44/// Принимает на вход строку вида `Variant1-Variant2-Variant3::value`
45#[proc_macro]
46pub fn message_new(msg: TokenStream) -> TokenStream {
47    let code = create_signal_from_msg::message_new(&msg.to_string());
48    let code = parse_str::<syn::Expr>(&code).unwrap();
49    TokenStream::from(quote! {
50        #code
51    })
52}
53
54// TODO - добавить макрос для для генерации match - веток