encryption_macros_key_generation/
lib.rs

1#![feature(if_let_guard)]
2#![feature(let_chains)]
3
4use proc_macro::TokenStream;
5use litrs::IntegerLit;
6use rand::{thread_rng, RngCore};
7use hex::encode;
8use quote::quote;
9
10static DEFAULT_KEY_LENGHT : usize = 128;
11
12#[proc_macro]
13pub fn generate_key(token_stream : TokenStream) -> TokenStream {
14    let key_len = match token_stream
15        .into_iter()
16        .collect::<Vec<_>>()
17        .first() {
18        Some(token) if let Ok(int_lit) = IntegerLit::try_from(token) && let Some(int) = int_lit.value::<usize>() => {
19            int
20        },
21        _ => DEFAULT_KEY_LENGHT,
22    };
23
24    let mut key_buffer = vec![0; key_len];
25    thread_rng().fill_bytes(&mut key_buffer);
26    let hex_encoded_key = encode(key_buffer);
27    quote! {
28        #hex_encoded_key
29    }.into()
30}