stak_minifier/
lib.rs

1//! Scheme source code minifier.
2
3use stak_configuration::DEFAULT_HEAP_SIZE;
4use stak_device::ReadWriteDevice;
5use stak_file::VoidFileSystem;
6use stak_macro::include_r7rs;
7use stak_process_context::VoidProcessContext;
8use stak_r7rs::{SmallError, SmallPrimitiveSet};
9use stak_time::VoidClock;
10use stak_vm::Vm;
11use std::io::{Read, Write, empty};
12
13/// Minifies given source codes.
14pub fn minify(reader: impl Read, writer: impl Write) -> Result<(), SmallError> {
15    const BYTECODE: &[u8] = include_r7rs!("minify.scm");
16
17    let mut heap = vec![Default::default(); DEFAULT_HEAP_SIZE];
18    let mut vm = Vm::new(
19        &mut heap,
20        SmallPrimitiveSet::new(
21            ReadWriteDevice::new(reader, writer, empty()),
22            VoidFileSystem::new(),
23            VoidProcessContext::new(),
24            VoidClock::new(),
25        ),
26    )?;
27
28    vm.initialize(BYTECODE.iter().copied())?;
29    vm.run()?;
30
31    Ok(())
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37    use pretty_assertions::assert_eq;
38
39    #[test]
40    fn minify_expression() {
41        let source = "(foo  bar)";
42        let mut target = vec![];
43
44        minify(source.as_bytes(), &mut target).unwrap();
45
46        assert_eq!(target, b"(foo bar)\n");
47    }
48
49    #[test]
50    fn minify_expressions() {
51        let source = "(foo  bar)\n\n(  baz   blah  )";
52        let mut target = vec![];
53
54        minify(source.as_bytes(), &mut target).unwrap();
55
56        assert_eq!(target, b"(foo bar)\n(baz blah)\n");
57    }
58}