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}