From 0eba0f996857a24f54dd3da35a669785a3dabc7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Ml=C3=A1dek?= Date: Mon, 24 Jun 2024 17:45:45 +0200 Subject: [PATCH] feat(jslib): add `getAs` convenience function to UpObject --- sdks/js/package.json | 2 +- sdks/js/src/index.ts | 28 +++++++++++++++ sdks/js/tests/upobject.test.ts | 65 ++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 sdks/js/tests/upobject.test.ts diff --git a/sdks/js/package.json b/sdks/js/package.json index e50c3a5..ed5c938 100644 --- a/sdks/js/package.json +++ b/sdks/js/package.json @@ -1,6 +1,6 @@ { "name": "@upnd/upend", - "version": "0.5.5", + "version": "0.6.0", "description": "Client library to interact with the UpEnd system.", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/sdks/js/src/index.ts b/sdks/js/src/index.ts index 5155b3b..243a627 100644 --- a/sdks/js/src/index.ts +++ b/sdks/js/src/index.ts @@ -98,6 +98,34 @@ export class UpObject { return this.attr[attr]?.[0].value.c; } + public getAs(attribute: string, as: "string"): string | undefined; + public getAs(attribute: string, as: "number"): number | undefined; + public getAs(attribute: string, as: "null"): null | undefined; + public getAs( + attribute: string, + as: "string" | "number" | "null", + ): string | number | null | undefined { + const value = this.attr[attribute]?.[0].value; + if (as === undefined) { + return this.attr[attribute]?.[0].value.c; + } else if (as === "string") { + return value?.c?.toString(); + } else if (as === "number") { + switch (value?.t) { + case "Number": + return value.c; + case "String": { + const converted = parseFloat(value.c); + return isNaN(converted) ? undefined : converted; + } + default: + return undefined; + } + } else if (as === "null") { + return value?.t === "Null" ? null : undefined; + } + } + public identify(): string[] { return (this.attr["LBL"] || []).map((e) => String(e.value.c)); } diff --git a/sdks/js/tests/upobject.test.ts b/sdks/js/tests/upobject.test.ts new file mode 100644 index 0000000..8104a47 --- /dev/null +++ b/sdks/js/tests/upobject.test.ts @@ -0,0 +1,65 @@ +import { UpListing, UpObject } from "../"; + +function testObj() { + const listing = new UpListing({ + a: { + entity: "test", + attribute: "string", + value: { t: "String", c: "hello" }, + provenance: "test", + timestamp: "0", + user: "test", + }, + b: { + entity: "test", + attribute: "number", + value: { t: "Number", c: 1 }, + provenance: "test", + timestamp: "0", + user: "test", + }, + c: { + entity: "test", + attribute: "null", + value: { t: "Null", c: null }, + provenance: "test", + timestamp: "0", + user: "test", + }, + d: { + entity: "test", + attribute: "stringy_number", + value: { t: "String", c: "3" }, + provenance: "test", + timestamp: "0", + user: "test", + }, + }); + return new UpObject("test", listing); +} + +describe("UpObject get function", () => { + test("getting as string works", () => { + const obj = testObj(); + expect(obj.getAs("string", "string")).toBe("hello"); + expect(obj.getAs("number", "string")).toBe("1"); + expect(obj.getAs("null", "string")).toBe(undefined); + expect(obj.getAs("stringy_number", "string")).toBe("3"); + }); + + test("getting as number works", () => { + const obj = testObj(); + expect(obj.getAs("string", "number")).toBe(undefined); + expect(obj.getAs("number", "number")).toBe(1); + expect(obj.getAs("null", "number")).toBe(undefined); + expect(obj.getAs("stringy_number", "number")).toBe(3); + }); + + test("getting as null works", () => { + const obj = testObj(); + expect(obj.getAs("string", "null")).toBe(undefined); + expect(obj.getAs("number", "null")).toBe(undefined); + expect(obj.getAs("null", "null")).toBe(null); + expect(obj.getAs("stringy_number", "null")).toBe(undefined); + }); +});