From 3f91e35790be6e3d7111295121441e492e03a263 Mon Sep 17 00:00:00 2001 From: Pablo Baleztena Date: Fri, 4 Oct 2024 11:07:57 -0300 Subject: [PATCH] [fabric/core] Add isVariant utility function --- .../core/src/variant/is-variant.spec.ts | 40 +++++++++++++++++++ .../fabric/core/src/variant/is-variant.ts | 11 +++++ 2 files changed, 51 insertions(+) create mode 100644 packages/fabric/core/src/variant/is-variant.spec.ts create mode 100644 packages/fabric/core/src/variant/is-variant.ts diff --git a/packages/fabric/core/src/variant/is-variant.spec.ts b/packages/fabric/core/src/variant/is-variant.spec.ts new file mode 100644 index 0000000..7632352 --- /dev/null +++ b/packages/fabric/core/src/variant/is-variant.spec.ts @@ -0,0 +1,40 @@ +import { describe, expect, expectTypeOf, it } from "vitest"; +import { isVariant } from "./is-variant.js"; +import { TaggedVariant, VariantTag } from "./variant.js"; + +interface SuccessVariant extends TaggedVariant<"success"> { + [VariantTag]: "success"; + data: string; +} + +interface ErrorVariant extends TaggedVariant<"error"> { + [VariantTag]: "error"; + message: string; +} + +describe("isVariant", () => { + const successVariant = { + [VariantTag]: "success", + data: "Operation successful", + } as SuccessVariant | ErrorVariant; + + const errorVariant = { + [VariantTag]: "error", + message: "Operation failed", + } as SuccessVariant | ErrorVariant; + + it("should return true for a matching tag and correctly infer it", () => { + if (isVariant(successVariant, "success")) { + expectTypeOf(successVariant).toEqualTypeOf(); + } + + if (isVariant(errorVariant, "error")) { + expectTypeOf(errorVariant).toEqualTypeOf(); + } + }); + + it("should return false for a non-matching tag", () => { + expect(isVariant(successVariant, "error")).toBe(false); + expect(isVariant(errorVariant, "success")).toBe(false); + }); +}); diff --git a/packages/fabric/core/src/variant/is-variant.ts b/packages/fabric/core/src/variant/is-variant.ts new file mode 100644 index 0000000..c4f86e1 --- /dev/null +++ b/packages/fabric/core/src/variant/is-variant.ts @@ -0,0 +1,11 @@ +import { TaggedVariant, VariantTag } from "./variant.js"; + +export function isVariant< + TVariant extends TaggedVariant, + TTag extends TVariant[VariantTag], +>( + variant: TVariant, + tag: TTag, +): variant is Extract { + return variant[VariantTag] === tag; +}