binary_macros_impl/
lib.rs

1extern crate data_encoding;
2extern crate proc_macro_hack;
3extern crate proc_macro;
4extern crate dotenv;
5
6use std::str::FromStr;
7use std::io::Read;
8use proc_macro_hack::proc_macro_hack;
9use proc_macro::TokenStream;
10
11fn helper(input: TokenStream, decoder: data_encoding::Encoding) -> TokenStream
12{
13    let input = input.to_string();
14    let input = input.trim_matches('"');
15
16    let byte_vec = if input.starts_with("file:") {
17
18        let mut file = std::fs::File::open(&input[5..]).expect("Error opening file");
19        let mut contents = String::new();
20        file.read_to_string(&mut contents).expect("Error reading file");
21        decoder.decode(contents.trim().as_bytes()).expect("Parse error")
22
23    } else if input.starts_with("env:") {
24
25        dotenv::dotenv().ok();
26        let var = std::env::var(&input[4..]).expect("Error reading environment variable");
27        decoder.decode(var.as_bytes()).expect("Parse error")
28
29    } else {
30
31        decoder.decode(input.as_bytes()).expect("Parse error")
32
33    };
34
35    TokenStream::from_str(&format!("{{static _BIN: [u8; {}] = {:?}; &_BIN}}", byte_vec.len(), byte_vec)).expect("Parse error")
36}
37
38
39#[proc_macro_hack]
40pub fn base16(input: TokenStream) -> TokenStream {
41    helper(input, data_encoding::HEXLOWER)
42}
43
44#[proc_macro_hack]
45pub fn base32hex(input: TokenStream) -> TokenStream {
46    helper(input, data_encoding::BASE32HEX)
47}
48
49#[proc_macro_hack]
50pub fn base32(input: TokenStream) -> TokenStream {
51    helper(input, data_encoding::BASE32)
52}
53
54#[proc_macro_hack]
55pub fn base64(input: TokenStream) -> TokenStream {
56    helper(input, data_encoding::BASE64)
57}
58
59#[proc_macro_hack]
60pub fn base64url(input: TokenStream) -> TokenStream {
61    helper(input, data_encoding::BASE64URL)
62}
63
64
65
66#[proc_macro_hack]
67pub fn base32hex_nopad(input: TokenStream) -> TokenStream {
68    helper(input, data_encoding::BASE32HEX_NOPAD)
69}
70
71#[proc_macro_hack]
72pub fn base32_nopad(input: TokenStream) -> TokenStream {
73    helper(input, data_encoding::BASE32_NOPAD)
74}
75
76#[proc_macro_hack]
77pub fn base64_nopad(input: TokenStream) -> TokenStream {
78    helper(input, data_encoding::BASE64_NOPAD)
79}
80
81#[proc_macro_hack]
82pub fn base64url_nopad(input: TokenStream) -> TokenStream {
83    helper(input, data_encoding::BASE64URL_NOPAD)
84}