#![doc = include_str!("../README.md")]
use itertools::Itertools;
use proc_macro::TokenStream;
use syn::parse_macro_input;
fn slice_to_array_token(input: &[u8]) -> TokenStream {
format!("[{}]", input.iter().join(", "))
.parse::<proc_macro2::TokenStream>()
.expect("Failed to parse array")
.into()
}
#[cfg(feature = "bs58")]
#[proc_macro]
pub fn bs58_to_array(input: TokenStream) -> TokenStream {
slice_to_array_token(
bs58::decode(parse_macro_input!(input as syn::LitStr).value())
.into_vec()
.expect("Can't decode bs58")
.as_slice(),
)
}
#[cfg(feature = "bs64")]
#[proc_macro]
pub fn bs64_to_array(input: TokenStream) -> TokenStream {
slice_to_array_token(
base64::decode(parse_macro_input!(input as syn::LitStr).value())
.expect("Can't decode bs64")
.as_slice(),
)
}
#[cfg(feature = "hex")]
#[proc_macro]
pub fn hex_to_array(input: TokenStream) -> TokenStream {
slice_to_array_token(
hex::decode(parse_macro_input!(input as syn::LitStr).value())
.expect("Can't decode hex")
.as_slice(),
)
}
#[cfg(feature = "bs58")]
#[proc_macro]
pub fn bs58_env_to_array(input: TokenStream) -> TokenStream {
slice_to_array_token(
bs58::decode(
std::env::var(parse_macro_input!(input as syn::LitStr).value()).expect("Env variable"),
)
.into_vec()
.expect("Can't decode bs58")
.as_slice(),
)
}
#[cfg(feature = "bs64")]
#[proc_macro]
pub fn bs64_env_to_array(input: TokenStream) -> TokenStream {
slice_to_array_token(
base64::decode(
std::env::var(parse_macro_input!(input as syn::LitStr).value())
.expect("This env not found"),
)
.expect("Can't decode bs64")
.as_slice(),
)
}
#[cfg(feature = "hex")]
#[proc_macro]
pub fn hex_env_to_array(input: TokenStream) -> TokenStream {
slice_to_array_token(
hex::decode(
std::env::var(parse_macro_input!(input as syn::LitStr).value())
.expect("This env not found"),
)
.expect("Can't decode hex")
.as_slice(),
)
}
#[cfg(feature = "bs32")]
#[proc_macro]
pub fn bs32_to_array(input: TokenStream) -> TokenStream {
slice_to_array_token(
base32::decode(
base32::Alphabet::Crockford,
&parse_macro_input!(input as syn::LitStr).value(),
)
.expect("Can't decode bs32")
.as_slice(),
)
}
#[cfg(feature = "bs32")]
#[proc_macro]
pub fn bs32_env_to_array(input: TokenStream) -> TokenStream {
slice_to_array_token(
base32::decode(
base32::Alphabet::Crockford,
&std::env::var(parse_macro_input!(input as syn::LitStr).value()).expect("Env variable"),
)
.expect("Can't decode bs32")
.as_slice(),
)
}
#[cfg(feature = "bs85")]
#[proc_macro]
pub fn bs85_to_array(input: TokenStream) -> TokenStream {
slice_to_array_token(
base85::decode(&parse_macro_input!(input as syn::LitStr).value())
.expect("Can't decode bs85")
.as_slice(),
)
}
#[cfg(feature = "bs85")]
#[proc_macro]
pub fn bs85_env_to_array(input: TokenStream) -> TokenStream {
slice_to_array_token(
base85::decode(
&std::env::var(parse_macro_input!(input as syn::LitStr).value()).expect("Env variable"),
)
.expect("Can't decode bs85")
.as_slice(),
)
}