From c7c0352b3d0fb4a0d62bd4b7cefc3726e42552cf Mon Sep 17 00:00:00 2001 From: "Wesley Finck (aider)" Date: Tue, 3 Jun 2025 17:09:45 -0700 Subject: [PATCH] refactor: improve URL value object error handling with domain-specific errors --- src/modules/cards/domain/value-objects/URL.ts | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/modules/cards/domain/value-objects/URL.ts b/src/modules/cards/domain/value-objects/URL.ts index f188c6f9..2307012b 100644 --- a/src/modules/cards/domain/value-objects/URL.ts +++ b/src/modules/cards/domain/value-objects/URL.ts @@ -1,5 +1,12 @@ import { ValueObject } from '../../../../shared/domain/ValueObject'; -import { Result } from '../../../../shared/core/Result'; +import { Result, ok, err } from '../../../../shared/core/Result'; + +export class InvalidURLError extends Error { + constructor(message: string) { + super(message); + this.name = 'InvalidURLError'; + } +} interface URLProps { value: string; @@ -14,17 +21,19 @@ export class URL extends ValueObject { super(props); } - public static create(url: string): Result { + public static create(url: string): Result { if (!url || url.trim().length === 0) { - return Result.fail('URL cannot be empty'); + return err(new InvalidURLError('URL cannot be empty')); } + const trimmedUrl = url.trim(); + try { - // Validate URL format - new globalThis.URL(url); - return Result.ok(new URL({ value: url.trim() })); + // Validate URL format using the global URL constructor + new globalThis.URL(trimmedUrl); + return ok(new URL({ value: trimmedUrl })); } catch (error) { - return Result.fail('Invalid URL format'); + return err(new InvalidURLError('Invalid URL format')); } } -- 2.51.2