use proc_macro::TokenStream;
use proc_macro2::{Literal, Span};
use quote::quote;
use syn::{parse_macro_input, LitStr};
#[proc_macro]
pub fn include_str_from_url(tokens: TokenStream) -> TokenStream {
include_url(tokens, IncludeType::String)
}
#[proc_macro]
pub fn include_bytes_from_url(tokens: TokenStream) -> TokenStream {
include_url(tokens, IncludeType::Bytes)
}
enum IncludeType {
String,
Bytes,
}
fn include_url(tokens: TokenStream, include_type: IncludeType) -> TokenStream {
let input = parse_macro_input!(tokens as LitStr);
match include_url_inner(&input.value(), include_type) {
Ok(lit) => quote! {
#lit
}
.into(),
Err(e) => syn::Error::new(Span::call_site(), e)
.into_compile_error()
.into(),
}
}
fn include_url_inner(url: &str, include_type: IncludeType) -> reqwest::Result<Literal> {
let res = reqwest::blocking::get(url)?;
match include_type {
IncludeType::String => {
let text = res.text()?;
Ok(Literal::string(&text))
}
IncludeType::Bytes => {
let bytes = res.bytes()?;
Ok(Literal::byte_string(&bytes))
}
}
}