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 }