Skip to content

Commit 3f0ffd6

Browse files
author
Willem Wyndham
committed
fix: add " to string's toString and make toString an abstract method
1 parent e68b42e commit 3f0ffd6

File tree

1 file changed

+12
-45
lines changed

1 file changed

+12
-45
lines changed

assembly/JSON.ts

Lines changed: 12 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ namespace _JSON {
107107
}
108108
}
109109

110+
// @ts-ignore
111+
@lazy const NULL: Null = new Null();
112+
110113
export abstract class Value {
111114
static String(str: string): Str {
112115
return new Str(str);
@@ -124,7 +127,7 @@ export abstract class Value {
124127
return new Bool(b);
125128
}
126129
static Null(): Null {
127-
return new Null();
130+
return NULL;
128131
}
129132
static Array(): Arr {
130133
return new Arr();
@@ -189,10 +192,7 @@ export abstract class Value {
189192
return false;
190193
}
191194

192-
toString(): string {
193-
throw new Error("Values must be casted to their JSON type for .toString()");
194-
return "";
195-
}
195+
abstract toString(): string;
196196
}
197197

198198
export class Str extends Value {
@@ -201,7 +201,7 @@ export class Str extends Value {
201201
}
202202

203203
toString(): string {
204-
return this._str;
204+
return `"${this._str}"`;
205205
}
206206

207207
valueOf(): string {
@@ -307,47 +307,14 @@ export class Obj extends Value {
307307
}
308308

309309
toString(): string {
310-
const objs: string[] = [];
310+
const objs: string[] = new Array<string>(this.keys.length);
311311
for (let i: i32 = 0; i < this.keys.length; i++) {
312-
let keyValueString = '"' + this.keys[i] + '": ';
313-
314-
// Cast our value into it's appropriate type
315-
let value: Value | null = this._obj.get(this.keys[i]);
316-
317-
// Check for null values
318-
if (value == null || value.isNull) {
319-
objs.push(keyValueString += "null");
320-
continue;
321-
}
322-
323-
// Cast to our proper type
324-
if (value.isString) {
325-
let castedValue = changetype<Str>(value);
326-
keyValueString += '"' + castedValue.toString() + '"';
327-
} else if (value.isNum) {
328-
let castedValue = changetype<Num>(value);
329-
keyValueString += castedValue.toString();
330-
} else if (value.isFloat) {
331-
let castedValue = changetype<Float>(value);
332-
keyValueString += castedValue.toString();
333-
} else if (value.isInteger) {
334-
let castedValue = changetype<Integer>(value);
335-
keyValueString += castedValue.toString();
336-
} else if (value.isBool) {
337-
let castedValue = changetype<Bool>(value);
338-
keyValueString += castedValue.toString();
339-
} else if (value.isArr) {
340-
let castedValue = changetype<Arr>(value);
341-
keyValueString += castedValue.toString();
342-
} else if (value.isObj) {
343-
let castedValue = changetype<Obj>(value);
344-
keyValueString += castedValue.toString();
345-
}
346-
347-
// Push the keyValueString
348-
objs.push(keyValueString);
312+
const key = this.keys[i];
313+
const value = this._obj.get(key) || Value.Null();
314+
objs[i] = `"${key}":${value}`;
349315
}
350-
return "{" + objs.join(",") + "}";
316+
317+
return `{${objs.join(",")}}`;
351318
}
352319

353320
valueOf(): Map<string, Value> {

0 commit comments

Comments
 (0)