extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use syn::{Expr, Lit};
#[proc_macro]
pub fn s(input: TokenStream) -> TokenStream {
if input.is_empty() {
quote! { String::new() }.into()
}
else if let Ok(expr) = syn::parse::<Expr>(input.clone()) {
if let Expr::Lit(ref lit) = expr {
if let Lit::Str(_) = lit.lit {
return quote! { format!(#expr) }.into();
}
}
quote! { format!("{}", #expr) }.into()
}
else {
let input = proc_macro2::TokenStream::from(input);
quote! { format!(#input) }.into()
}
}