notugly

Simple and generic pretty-printing library, heavily based on A prettier printer.

How to use

To define pretty-printing for a type, implement the Format trait using the various utility functions: - nil for a null element - text to create a string into a document - nest to indent a document - cat to concatenate two documents - group and group_with to add the flattened layout as an alternative. - fold, spread, stack and fill to collapse a list of documents in various ways

To make it easier to define a structure, some operators are defined: - x & y == cat(x,y) - x + y == x & text(" ") & y - x / y == x & line() & y - x * y == x & group(line) & y

See the examples/ directory for fully-featured examples.

Example : S-Expressions

```rust use notugly::*;

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

impl Format for SExpr { fn format(&self) -> Document { match self { SExpr::Number(n) => text(format!("{n}")), SExpr::Call(name, v) => groupwith( "", group(text("(") & text(name) & nest(2, line() & stack(v))) / text(")"), ), } } } fn main() { let bigeq = sexpr!(add (mul 2 6) (div (mul 4 (mul 3 2 1)) (add 1 (sub 3 (add 1 1)))));

println!("{}", big_eq.pretty(40));

} ```