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
38
39
use super::StringRef;
use super::WriteItem;
use std::rc::Rc;
pub struct PrintWriteItemsOptions {
pub indent_width: u8,
pub use_tabs: bool,
pub newline_kind: &'static str,
}
pub fn print_write_items<T>(write_items: impl Iterator<Item = WriteItem<T>>, options: PrintWriteItemsOptions) -> String where T : StringRef {
let mut final_string = String::new();
let indent_string = if options.use_tabs { String::from("\t") } else { " ".repeat(options.indent_width as usize) };
for item in write_items.into_iter() {
match item {
WriteItem::Indent => final_string.push_str(&indent_string),
WriteItem::NewLine => final_string.push_str(&options.newline_kind),
WriteItem::Tab => final_string.push_str("\t"),
WriteItem::Space => final_string.push_str(" "),
WriteItem::String(text) => {
final_string.push_str(&match Rc::try_unwrap(text) {
Result::Ok(moved_text) => moved_text.get_text(),
Result::Err(text) => text.get_text_clone(),
});
},
}
}
final_string
}