prettify/print/
indent.rs

1use super::super::doc::PrettifyConfig;
2use super::shared::{Indent, IndentKind};
3use std::rc::Rc;
4
5pub fn make_indent(indent: Rc<Indent>, config: &PrettifyConfig) -> Rc<Indent> {
6    generate_indent(
7        indent,
8        Indent {
9            kind: Some(IndentKind::Indent),
10            length: 0,
11            queue: Vec::new(),
12            value: String::new(),
13        },
14        config,
15    )
16}
17
18pub fn generate_indent(
19    indent: Rc<Indent>,
20    new_indent: Indent,
21    config: &PrettifyConfig,
22) -> Rc<Indent> {
23    let queue = generate_initial_queue(&indent, Rc::new(new_indent));
24    let mut value = String::new();
25
26    for item in &queue {
27        match &item.kind {
28            Some(IndentKind::Indent) => {
29                value.push_str(&" ".repeat(config.tab_width));
30            }
31            Some(IndentKind::StringAlign(text)) => {
32                value.push_str(text);
33            }
34            Some(IndentKind::NumberAlign(width)) => {
35                value.push_str(&" ".repeat(*width));
36            }
37            Some(IndentKind::Dedent) | None => {
38                panic!("Unexpected indent kind");
39            }
40        }
41    }
42
43    Rc::new(Indent {
44        length: value.len(),
45        value,
46        queue,
47        kind: indent.as_ref().clone().kind,
48    })
49}
50
51fn generate_initial_queue(indent: &Indent, new_indent: Rc<Indent>) -> Vec<Rc<Indent>> {
52    match new_indent.kind {
53        Some(IndentKind::Dedent) => {
54            let mut cloned_queue = indent.queue.clone();
55            cloned_queue.pop();
56            cloned_queue
57        }
58        _ => {
59            let mut cloned_queue = indent.queue.clone();
60            cloned_queue.push(new_indent);
61            cloned_queue
62        }
63    }
64}