Skip to content

Commit

Permalink
feat: serializeTo
Browse files Browse the repository at this point in the history
  • Loading branch information
JairusSW committed Oct 31, 2023
1 parent 934cc0c commit e3b72e8
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 18 deletions.
2 changes: 1 addition & 1 deletion assembly/__tests__/as-json.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ class HttpResp {

describe("Deser externals", () => {
it("should deserialize valid JSON strings", () => {
canDeser<Map4>('\n{"a":\r"\\\\",\n\r"b":"}","c":"][","d"\t:\t"\\""}', { a: '\\', b: '}', c: '][', d: '"' })
canDeser<Map4>('{"a":\r"\\\\",\n\r"b":"}","c":"][","d"\t:\t"\\""}', { a: '\\', b: '}', c: '][', d: '"' })
canDeser<Vec3>('{"x":0.4,"y":1.4,"z":0.0}', { x: 0.4, y: 1.4, z: 0 })
canDeser<HttpResp>('{"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}}"}',
{
Expand Down
85 changes: 83 additions & 2 deletions assembly/src/json.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,87 @@ export namespace JSON {
);
}
}
/**
* Stringifies valid JSON data.
* ```js
* JSON.stringify<T>(data)
* ```
* @param data T
* @returns string
*/
// @ts-ignore: Decorator
@inline export function stringifyTo<T>(data: T, out: string): void {
// String
if (isString<T>() && data != null) {
out = serializeString(data as string);
return;
} else if (isBoolean<T>()) {
out = data ? "true" : "false";
return;
} else if (isNullable<T>() && data == null) {
out = "null";
return;
// @ts-ignore
} else if ((isInteger<T>() || isFloat<T>()) && 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<T>()) {
// @ts-ignore
if (data.length == 0) {
out = emptyArrayWord;
return;
// @ts-ignore
} else if (isString<valueof<T>>()) {
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<valueof<T>>()) {
// @ts-ignore
out = leftBracketWord + data.join(commaWord) + rightBracketWord;
return;
// @ts-ignore
} else if (isFloat<valueof<T>>() || isInteger<valueof<T>>()) {
// @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<T>()}. Make sure to add the correct decorators to classes.`
);
}
}
/**
* Parses valid JSON strings into their original format.
* ```js
Expand All @@ -123,14 +204,14 @@ export namespace JSON {
return parseNumber<T>(data);
} else if (isArrayLike<T>()) {
// @ts-ignore
return parseArray<T>(data.trimStart());
return parseArray<T>(data);
// @ts-ignore
} else if (isNullable<T>() && data == "null") {
// @ts-ignore
return null;
// @ts-ignore
} else if (isDefined(type.__JSON_Set_Key)) {
return parseObject<T>(data.trimStart());
return parseObject<T>(data);
} else if (idof<nonnull<T>>() == idof<Date>()) {
// @ts-ignore
return Date.fromString(data);
Expand Down
21 changes: 10 additions & 11 deletions assembly/test.ts
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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",
Expand All @@ -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<Vec3>('{"x":3.4,"y":1.2,"z":8.3}')));
console.log("Implemented: " + JSON.stringify(JSON.parse<Vec3>('{}')));

console.log("Original: " + JSON.stringify(player));
//console.log("Revised: " + vec.__JSON_Deserialize('{"x":3,"y":1,"z":8}').__JSON_Serialize());
Expand Down
8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down

0 comments on commit e3b72e8

Please sign in to comment.