1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//! Code formatter.
#![doc(html_root_url = "https://docs.rs/gluon_formatter/0.6.1")] // # GLUON

extern crate itertools;
extern crate pretty;
#[macro_use]
extern crate gluon_base as base;
extern crate gluon_parser as parser;

mod pretty_print;

pub fn format_expr(input: &str) -> Result<String, parser::ParseErrors> {
    use base::source::Source;
    use base::symbol::Symbols;
    use base::types::TypeCache;

    let newline = match input.find(|c: char| c == '\n' || c == '\r') {
        Some(i) => {
            if input[i..].starts_with("\r\n") {
                "\r\n"
            } else if input[i..].starts_with("\r") {
                "\r"
            } else {
                "\n"
            }
        }
        None => "\n",
    };

    let type_cache = TypeCache::new();
    let expr = parser::parse_expr(&mut Symbols::new(), &type_cache, input)?;

    let source = Source::new(input);
    let arena = pretty::Arena::new();
    let printer = pretty_print::Printer::new(&arena, &source);
    Ok(printer.format(100, newline, &expr))
}