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 module rpdl.value;
6 
7 import rpdl.node;
8 import std.conv;
9 
10 class Value: Node {
11     enum Type {Number, String, Identifier, Boolean, Array};
12 
13     this(in string name) { super(name); }
14     this(in string name, Node parent) { super(name, parent); }
15 
16     @property Type type() { return p_type; }
17 
18     Value clone(in string name) {
19         throw new Error("Not supported");
20     }
21 
22 protected:
23     Type p_type;
24 }
25 
26 final class NumberValue: Value {
27     @property float value() { return p_value; }
28 
29     this(in string name, in float value) {
30         super(name);
31         this.p_value = value;
32         this.p_type = Type.Number;
33     }
34 
35     override string toString() {
36         return to!string(p_value);
37     }
38 
39     override Value clone(in string name) {
40         return new NumberValue(name, value);
41     }
42 
43 private:
44     float p_value;
45 }
46 
47 final class BooleanValue : Value {
48     @property bool value() { return p_value; }
49 
50     this(in string name, in bool value) {
51         super(name);
52         this.p_value = value;
53         this.p_type = Type.Boolean;
54     }
55 
56     override string toString() {
57         return to!string(p_value);
58     }
59 
60     override Value clone(in string name) {
61         return new BooleanValue(name, value);
62     }
63 
64 private:
65     bool p_value;
66 }
67 
68 class StringValue : Value {
69     @property string value() { return p_value; }
70     @property dstring utf32Value() { return p_utfValue; }
71 
72     this(in string name, in string value) {
73         super(name);
74         this.p_value = value;
75         this.p_type = Type.String;
76     }
77 
78     this(in string name, in string value, in dstring utfValue) {
79         super(name);
80         this.p_value = value;
81         this.p_utfValue = utfValue;
82         this.p_type = Type.String;
83     }
84 
85     override string toString() {
86         return "\"" ~ to!string(p_value) ~ "\"";
87     }
88 
89     override Value clone(in string name) {
90         return new StringValue(name, value, utf32Value);
91     }
92 
93 private:
94     string p_value;
95     dstring p_utfValue;
96 }
97 
98 final class IdentifierValue : StringValue {
99     this(in string name, in string value) {
100         super(name, value);
101         this.p_type = Type.Identifier;
102     }
103 
104     this(in string name, in string value, in dstring utfValue) {
105         super(name, value, utfValue);
106         this.p_type = Type.Identifier;
107     }
108 
109     override string toString() {
110         return to!string(p_value);
111     }
112 
113     override Value clone(in string name) {
114         return new IdentifierValue(name, value);
115     }
116 }
117 
118 final class ArrayValue: Value {
119     this(in string name) {
120         super(name);
121         this.p_type = Type.Array;
122     }
123 
124     override Value clone(in string name) {
125         auto array = new ArrayValue(name);
126 
127         foreach (child; children) {
128             auto value = cast(Value) child;
129             assert(value !is null);
130             array.insert(value.clone(to!string(array.children.length)));
131         }
132 
133         return array;
134     }
135 }