notugly 0.2.2

A simple and generic pretty-printing library
Documentation
use notugly::*;

enum SExpr {
    Number(i32),
    Call(String, Vec<SExpr>),
}

impl Format for SExpr {
    fn format(&self) -> Document {
        match self {
            SExpr::Number(n) => text(format!("{n}")),
            SExpr::Call(name, v) => group_with(
                "",
                group(text("(") & text(name) & nest(2, line() & stack(v))) / text(")"),
            ),
        }
    }
}

macro_rules! sexpr {
    ($n:literal) => { SExpr::Number($n) };
    ($name:ident $($args:tt)*) => { SExpr::Call(stringify!($name).into(), vec![$(sexpr!($args)),*])};
    (($name:ident $($args:tt)*)) => { SExpr::Call(stringify!($name).into(), vec![$(sexpr!($args)),*])};
}

fn main() {
    let big_eq = sexpr!(add (mul 2 6) (div (mul 4 (mul 3 2 1)) (add 1 (sub 3 (add 1 1)))));

    println!(
        "{}\n---\n{}\n---\n{}\n---\n{}\n---\n{}",
        big_eq.pretty(80),
        big_eq.pretty(60),
        big_eq.pretty(40),
        nest(20, line() & big_eq.format()).pretty(60),
        big_eq.pretty(20)
    );
}