Skip to content

Commit

Permalink
feat(smithy-client): add isInstance method for ServiceException class (
Browse files Browse the repository at this point in the history
…#1484)

* feat(smithy-client): add isInstance helper for ServiceException class

* chore(smithy-client): add changeset

* feat(smithy-client): add support for instanceof operator

* chore(smithy-client): explicit access modifier
  • Loading branch information
siddsriv authored Jan 2, 2025
1 parent e42eb49 commit 23129d9
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .changeset/warm-pans-cross.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@smithy/smithy-client": minor
---

feat: type check helper method to to know if something is an instance of the ServiceException class
51 changes: 51 additions & 0 deletions packages/smithy-client/src/exceptions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,57 @@ it("ExceptionOptionType allows specifying message", () => {
expect(exception.code).toBe("code");
});

describe("ServiceException type checking", () => {
const error = new ServiceException({
name: "Error",
$fault: "client",
$metadata: {},
});

const duckTyped = {
$fault: "server",
$metadata: {},
};

describe("isInstance", () => {
it("should return true for ServiceException instances", () => {
expect(ServiceException.isInstance(error)).toBe(true);
});

it("should return true for duck-typed objects", () => {
expect(ServiceException.isInstance(duckTyped)).toBe(true);
});

it("should return false for null or undefined", () => {
expect(ServiceException.isInstance(null)).toBe(false);
expect(ServiceException.isInstance(undefined)).toBe(false);
});

it("should return false for invalid $fault values", () => {
expect(ServiceException.isInstance({ $fault: "invalid", $metadata: {} })).toBe(false);
});

it("should return false for missing properties", () => {
expect(ServiceException.isInstance({ $fault: "client" })).toBe(false);
expect(ServiceException.isInstance({ $metadata: {} })).toBe(false);
});
});

describe("instanceof", () => {
it("should return true for ServiceException instances", () => {
expect(error instanceof ServiceException).toBe(true);
});

it("should return true for duck-typed objects", () => {
expect(duckTyped instanceof ServiceException).toBe(true);
});

it("should return false for invalid objects", () => {
expect({} instanceof ServiceException).toBe(false);
});
});
});

describe("decorateServiceException", () => {
const exception = new ServiceException({
name: "Error",
Expand Down
17 changes: 17 additions & 0 deletions packages/smithy-client/src/exceptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,23 @@ export class ServiceException extends Error implements SmithyException, Metadata
this.$fault = options.$fault;
this.$metadata = options.$metadata;
}

/**
* Checks if a value is an instance of ServiceException (duck typed)
*/
public static isInstance(value: unknown): value is ServiceException {
if (!value) return false;
const candidate = value as ServiceException;
return (
Boolean(candidate.$fault) &&
Boolean(candidate.$metadata) &&
(candidate.$fault === "client" || candidate.$fault === "server")
);
}

public static [Symbol.hasInstance](instance: unknown) {
return ServiceException.isInstance(instance);
}
}

/**
Expand Down

0 comments on commit 23129d9

Please sign in to comment.