#![doc = include_str!("../README.md")]
use proc_macro::TokenStream;
use proc_macro2::{Ident, Span};
use quote::{quote, quote_spanned};
use syn::parse::Parse;
use syn::{LitStr, parse_macro_input};
#[proc_macro]
pub fn clyle(tokens: TokenStream) -> TokenStream {
let source = parse_macro_input!(tokens as LitStr);
let span = source.span();
let parsed = clyle_core::clyle(&source.value());
let expanded = quote_spanned!(span=> #parsed);
TokenStream::from(expanded)
}
struct FormatArgs {
s: LitStr,
rest: proc_macro2::TokenStream,
}
impl Parse for FormatArgs {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
Ok(FormatArgs {
s: input.parse()?,
rest: input.parse()?,
})
}
}
fn impl_fmt(name: &str, tokens: TokenStream) -> TokenStream {
let args = parse_macro_input!(tokens as FormatArgs);
let parsed = clyle_core::clyle(&args.s.value());
let name = Ident::new(name, Span::call_site());
let s = LitStr::new(&parsed, args.s.span());
let rest = args.rest;
let expanded = quote!(::std::#name!(#s #rest));
TokenStream::from(expanded)
}
#[proc_macro]
pub fn format(tokens: TokenStream) -> TokenStream {
impl_fmt("format", tokens)
}
#[proc_macro]
pub fn print(tokens: TokenStream) -> TokenStream {
impl_fmt("print", tokens)
}
#[proc_macro]
pub fn println(tokens: TokenStream) -> TokenStream {
impl_fmt("println", tokens)
}
#[proc_macro]
pub fn eprint(tokens: TokenStream) -> TokenStream {
impl_fmt("eprint", tokens)
}
#[proc_macro]
pub fn eprintln(tokens: TokenStream) -> TokenStream {
impl_fmt("eprintln", tokens)
}
#[proc_macro]
pub fn write(tokens: TokenStream) -> TokenStream {
impl_fmt("write", tokens)
}
#[proc_macro]
pub fn writeln(tokens: TokenStream) -> TokenStream {
impl_fmt("writeln", tokens)
}