assemblyscript-unittest-framework
Version:
assemblyscript unit test framework
97 lines (96 loc) • 2.73 kB
text/typescript
export function toJson<T>(v: T): string {
if (isNullable(v) && v == null) {
return "null";
}
if (isBoolean<T>(v)) {
return v ? "true" : "false";
}
if (isInteger<T>(v) || isFloat<T>(v) || isFunction<T>(v)) {
return v.toString();
}
if (isString<T>(v)) {
const str: string = v.toString();
const jsonchars: string[] = [];
for (let i = 0; i < str.length; i++) {
const charCode = str.charCodeAt(i);
if (
(charCode >= 0x20 && charCode <= 0x21) ||
(charCode >= 0x23 && charCode <= 0x5b) ||
(charCode >= 0x5d && charCode <= 0xffff)
) {
jsonchars.push(str.charAt(i));
} else {
switch (charCode) {
case 0x00:
jsonchars.push("\\0");
break;
case 0x07:
jsonchars.push("\\a");
break;
case 0x08:
jsonchars.push("\\b");
break;
case 0x09:
jsonchars.push("\\t");
break;
case 0x0a:
jsonchars.push("\\n");
break;
case 0x0b:
jsonchars.push("\\v");
break;
case 0x0c:
jsonchars.push("\\f");
break;
case 0x0d:
jsonchars.push("\\r");
break;
case 0x22:
jsonchars.push('\\"');
break;
case 0x5c:
jsonchars.push("\\\\");
break;
default: {
// unknown control code
const charCodeStr = charCode.toString();
jsonchars.push("\\u");
for (let i = charCodeStr.length; i < 4; i++) {
jsonchars.push("0");
}
jsonchars.push(charCodeStr);
}
}
}
}
return '"' + jsonchars.join("") + '"';
}
if (v instanceof ArrayBuffer) {
const tmpArray = Uint8Array.wrap(v);
const tmpStrArray = new Array<string>(tmpArray.length);
for (let i = 0; i < tmpArray.length; i++) {
tmpStrArray[i] = tmpArray[i].toString();
}
return `[${tmpStrArray.join(", ")}]`;
}
if (isArray<T>(v) || isArrayLike<T>(v)) {
const tempStrArray = new Array<string>(v.length);
for (let i = 0, k = v.length; i < k; i++) {
tempStrArray[i] = toJson(v[i]);
}
return `[${tempStrArray.join(", ")}]`;
}
if (v instanceof Set) {
return toJson(v.values());
}
if (v instanceof Map) {
const key = v.keys();
const value = v.values();
const tempStrArray = new Array<string>();
for (let i = 0; i < key.length; i++) {
tempStrArray[i] = toJson(key[i]) + " : " + toJson(value[i]);
}
return `{ ${tempStrArray.join(", ")} }`;
}
return "[Object " + nameof<T>(v) + "]";
}