stak_minifier_macro/
lib.rs

1//! Macros to minify Scheme source codes.
2
3extern crate alloc;
4
5use alloc::str;
6use core::error::Error;
7use proc_macro::TokenStream;
8use proc_macro2::Literal;
9use quote::quote;
10use stak_macro_util::{convert_result, read_source_file};
11use syn::{LitStr, parse_macro_input};
12
13/// Minifies source codes in Scheme.
14///
15/// # Examples
16///
17/// ```rust
18/// const SCRIPT: &str = stak_minifier_macro::minify!("( foo  bar )\n\n(baz)");
19///
20/// assert_eq!(SCRIPT, "(foo bar)\n(baz)\n");
21/// ```
22#[proc_macro]
23pub fn minify(input: TokenStream) -> TokenStream {
24    let input = parse_macro_input!(input as LitStr);
25
26    convert_result(minify_source(&input.value())).into()
27}
28
29/// Includes and minifies source codes in Scheme in a file.
30///
31/// # Examples
32///
33/// ```rust
34/// const SCRIPT: &str = stak_minifier_macro::include_minified!("foo.scm");
35///
36/// assert_eq!(SCRIPT, "(foo bar)\n(baz)\n");
37/// ```
38#[proc_macro]
39pub fn include_minified(input: TokenStream) -> TokenStream {
40    let input = parse_macro_input!(input as LitStr);
41
42    convert_result((|| minify_source(&read_source_file(input)?))()).into()
43}
44
45fn minify_source(source: &str) -> Result<proc_macro2::TokenStream, Box<dyn Error>> {
46    let mut buffer = vec![];
47
48    stak_minifier::minify(source.as_bytes(), &mut buffer)?;
49
50    let target = Literal::string(str::from_utf8(&buffer)?);
51
52    Ok(quote! { #target })
53}