From e3b72e8a197ab2645200920a70a706f983d99f73 Mon Sep 17 00:00:00 2001 From: Jairus Date: Mon, 30 Oct 2023 20:30:43 -0700 Subject: [PATCH] feat: serializeTo --- assembly/__tests__/as-json.spec.ts | 2 +- assembly/src/json.ts | 85 +++++++++++++++++++++++++++++- assembly/test.ts | 21 ++++---- package.json | 8 +-- 4 files changed, 98 insertions(+), 18 deletions(-) diff --git a/assembly/__tests__/as-json.spec.ts b/assembly/__tests__/as-json.spec.ts index df5d354..f07805f 100644 --- a/assembly/__tests__/as-json.spec.ts +++ b/assembly/__tests__/as-json.spec.ts @@ -189,7 +189,7 @@ class HttpResp { describe("Deser externals", () => { it("should deserialize valid JSON strings", () => { - canDeser('\n{"a":\r"\\\\",\n\r"b":"}","c":"][","d"\t:\t"\\""}', { a: '\\', b: '}', c: '][', d: '"' }) + canDeser('{"a":\r"\\\\",\n\r"b":"}","c":"][","d"\t:\t"\\""}', { a: '\\', b: '}', c: '][', d: '"' }) canDeser('{"x":0.4,"y":1.4,"z":0.0}', { x: 0.4, y: 1.4, z: 0 }) canDeser('{"statusCode":200,"headers":[["Conn\\\\ection","close"],["Content-Length","375"],["ETag","W/\\"177-/Ihew5Z+fiI8NLbTM2Wyphl/PFY\\""]],\n"body":"{\\n \\\"args\\\": {},\\n \\\"headers\\\": {\\n \\\"content-length\\\": \\\"0\\\",\\n \\\"accept\\\": \\\"*/*\\\" \\n}}"}', { diff --git a/assembly/src/json.ts b/assembly/src/json.ts index 74557a7..a056bcd 100644 --- a/assembly/src/json.ts +++ b/assembly/src/json.ts @@ -101,6 +101,87 @@ export namespace JSON { ); } } + /** + * Stringifies valid JSON data. + * ```js + * JSON.stringify(data) + * ``` + * @param data T + * @returns string + */ + // @ts-ignore: Decorator + @inline export function stringifyTo(data: T, out: string): void { + // String + if (isString() && data != null) { + out = serializeString(data as string); + return; + } else if (isBoolean()) { + out = data ? "true" : "false"; + return; + } else if (isNullable() && data == null) { + out = "null"; + return; + // @ts-ignore + } else if ((isInteger() || isFloat()) && isFinite(data)) { + // @ts-ignore + out = data.toString(); + return; + // @ts-ignore: Hidden function + } else if (isDefined(data.__JSON_Serialize)) { + // @ts-ignore: Hidden function + out = data.__JSON_Serialize(); + return; + } else if (data instanceof Date) { + out = data.toISOString(); + return; + } else if (isArrayLike()) { + // @ts-ignore + if (data.length == 0) { + out = emptyArrayWord; + return; + // @ts-ignore + } else if (isString>()) { + out = "["; + // @ts-ignore + for (let i = 0; i < data.length - 1; i++) { + // @ts-ignore + out += serializeString(unchecked(data[i])); + out += commaWord; + } + // @ts-ignore + out += serializeString(unchecked(data[data.length - 1])); + out += rightBracketWord; + return; + // @ts-ignore + } else if (isBoolean>()) { + // @ts-ignore + out = leftBracketWord + data.join(commaWord) + rightBracketWord; + return; + // @ts-ignore + } else if (isFloat>() || isInteger>()) { + // @ts-ignore + out = leftBracketWord + data.join(commaWord) + rightBracketWord; + return; + } else { + let result = new StringSink(leftBracketWord); + // @ts-ignore + for (let i = 0; i < data.length - 1; i++) { + // @ts-ignore + result.write(JSON.stringify(unchecked(data[i]))); + result.write(commaWord); + } + // @ts-ignore + result.write(JSON.stringify(unchecked(data[data.length - 1]))); + result.write(rightBracketWord); + out = result.toString(); + return; + } + } else { + throw new Error( + `Could not serialize data of type ${nameof()}. Make sure to add the correct decorators to classes.` + ); + } + } /** * Parses valid JSON strings into their original format. * ```js @@ -123,14 +204,14 @@ export namespace JSON { return parseNumber(data); } else if (isArrayLike()) { // @ts-ignore - return parseArray(data.trimStart()); + return parseArray(data); // @ts-ignore } else if (isNullable() && data == "null") { // @ts-ignore return null; // @ts-ignore } else if (isDefined(type.__JSON_Set_Key)) { - return parseObject(data.trimStart()); + return parseObject(data); } else if (idof>() == idof()) { // @ts-ignore return Date.fromString(data); diff --git a/assembly/test.ts b/assembly/test.ts index d13d422..2632ab1 100644 --- a/assembly/test.ts +++ b/assembly/test.ts @@ -1,11 +1,10 @@ -import { bench, blackbox } from "as-bench/assembly/bench"; import { JSON } from "./src/json"; // @ts-ignore @json class Vec3 { - x: f64; - y: f64; - z: f64; + x: f64 = 3.4; + y: f64 = 1.2; + z: f64 = 8.3; } // @ts-ignore @@ -19,11 +18,7 @@ class Player { isVerified: boolean; } -const vec: Vec3 = { - x: 3.4, - y: 1.2, - z: 8.3, -} +const vec = new Vec3(); const player: Player = { firstName: "Emmet", @@ -38,9 +33,13 @@ const player: Player = { isVerified: true, } -console.log("Original: " + JSON.stringify(vec)); +let out = ""; + +JSON.stringifyTo(vec, out); + +console.log("Original: " + out); //console.log("Revised: " + vec.__JSON_Deserialize('{"x":3,"y":1,"z":8}').__JSON_Serialize()); -console.log("Implemented: " + JSON.stringify(JSON.parse('{"x":3.4,"y":1.2,"z":8.3}'))); +console.log("Implemented: " + JSON.stringify(JSON.parse('{}'))); console.log("Original: " + JSON.stringify(player)); //console.log("Revised: " + vec.__JSON_Deserialize('{"x":3,"y":1,"z":8}').__JSON_Serialize()); diff --git a/package.json b/package.json index 65db92f..686667d 100644 --- a/package.json +++ b/package.json @@ -33,14 +33,14 @@ "@as-tral/cli": "^2.0.1", "@assemblyscript/wasi-shim": "^0.1.0", "as-bench": "^0.0.0-alpha", - "assemblyscript": "^0.27.9", + "assemblyscript": "^0.27.14", "assemblyscript-prettier": "^3.0.1", "benchmark": "^2.1.4", "kati": "^0.6.2", "microtime": "^3.1.1", - "prettier": "^3.0.2", - "tinybench": "^2.5.0", - "typescript": "^5.1.6", + "prettier": "^3.0.3", + "tinybench": "^2.5.1", + "typescript": "^5.2.2", "visitor-as": "^0.11.4" }, "dependencies": {