Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / docs-shared / lib / ApiResult.ts
blob584d522296b84bd2204840ea7cf76e98582284fe
1 import type { DocsApiErrorCode } from '@proton/shared/lib/api/docs'
3 export type DocsApiError = {
4   code: DocsApiErrorCode
5   message: string
8 export class ApiResult<T> {
9   constructor(
10     private isSuccess: boolean,
11     private error?: DocsApiError,
12     private value?: T,
13   ) {
14     Object.freeze(this)
15   }
17   isFailed(): boolean {
18     return !this.isSuccess
19   }
21   getValue(): T {
22     if (!this.isSuccess) {
23       throw new Error(`Cannot get value of an unsuccessful result: ${this.error}`)
24     }
26     return this.value as T
27   }
29   getError(): DocsApiError {
30     if (this.isSuccess || this.error === undefined) {
31       throw new Error('Cannot get an error of a successful result')
32     }
34     return this.error
35   }
37   getErrorMessage(): string {
38     if (this.isSuccess || this.error === undefined) {
39       throw new Error('Cannot get an error message of a successful result')
40     }
42     return this.error.message
43   }
45   static ok<U>(value?: U): ApiResult<U> {
46     return new ApiResult<U>(true, undefined, value)
47   }
49   static fail<U>(error: DocsApiError): ApiResult<U> {
50     if (!error) {
51       throw new Error('Attempting to create a failed result without an error')
52     }
54     return new ApiResult<U>(false, error)
55   }