1 /**
2  * Copyright: © 2017 Andrey Kabylin
3  * License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file.
4  */
5 
6 module rpdl.file_formats.text;
7 
8 import std.conv;
9 
10 import rpdl.node;
11 import rpdl.value;
12 import rpdl.writer;
13 
14 /// Tree writer to text file
15 final class TextWriter : Writer {
16     /**
17      * Write `root` node and it children to text file.
18      * Params:
19      *     root = Root node which need to write.
20      *     indentSize = indentation size of items.
21      */
22     this(Node root, in int indentSize = 4) {
23         super(root);
24         this.indentSize = indentSize;
25     }
26 
27 protected:
28     int currentDepth = 0;
29     int indentSize = 0;
30 
31     /// Write current indentation.
32     void writeIndent() {
33         for (int i = 0; i < currentDepth*indentSize; ++i)
34             rawWrite(' ');
35     }
36 
37     override void writeObject(ObjectNode object) {
38         writeIndent();
39         rawWrite(object.name);
40         rawWrite('\n');
41         ++currentDepth;
42         super.writeObject(object);
43         --currentDepth;
44     }
45 
46     override void writeParameter(Parameter parameter) {
47         writeIndent();
48         rawWrite(parameter.name);
49         rawWrite(": ");
50         int i = 0;
51 
52         foreach (Node child; parameter.children) {
53             if (cast(Value) child) {
54                 ++i;
55                 writeValue(cast(Value) child);
56 
57                 if (i < parameter.children.length)
58                     rawWrite(", ");
59             }
60         }
61 
62         rawWrite('\n');
63     }
64 
65     override void writeNumberValue(NumberValue node) {
66         rawWrite(to!string(node.value));
67     }
68 
69     override void writeBooleanValue(BooleanValue node) {
70         rawWrite(to!string(node.value));
71     }
72 
73     override void writeStringValue(StringValue node) {
74         rawWrite('"');
75         rawWrite(node.value);
76         rawWrite('"');
77     }
78 
79     override void writeIdentifierValue(IdentifierValue node) {
80         rawWrite(node.value);
81     }
82 
83     override void writeArrayValue(ArrayValue array) {
84         rawWrite("[");
85         int i = 0;
86 
87         foreach (Node node; array.children) {
88             ++i;
89             writeValue(cast(Value) node);
90 
91             if (i < array.children.length)
92                 rawWrite(", ");
93         }
94 
95         rawWrite("]");
96     }
97 }