encryption_macros_key_generation/
lib.rs1#![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}