Skip to content

Commit fa80235

Browse files
authored
Merge pull request #1 from takker99/change-error-type
Enable to apply `Result<T, E>` to any types
2 parents eb64747 + 2f165a4 commit fa80235

File tree

3 files changed

+31
-23
lines changed

3 files changed

+31
-23
lines changed

rest/page-data.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ export async function importPages(
3333
data: ImportedData<boolean>,
3434
{ sid, csrf }: ImportInit,
3535
): Promise<
36-
Result<{ message: string }, ErrorLike>
36+
Result<string, ErrorLike>
3737
> {
3838
if (data.pages.length === 0) {
39-
return { ok: true, message: "No pages to import." };
39+
return { ok: true, value: "No pages to import." };
4040
}
4141

4242
const formData = new FormData();
@@ -51,7 +51,7 @@ export async function importPages(
5151
if (!csrf) {
5252
const result = await getCSRFToken(sid);
5353
if (!result.ok) return result;
54-
csrf = result.csrfToken;
54+
csrf = result.value;
5555
}
5656

5757
const path = `https://scrapbox.io/api/page-data/import/${project}.json`;
@@ -72,17 +72,17 @@ export async function importPages(
7272
if (res.status === 503) {
7373
throw makeCustomError("ServerError", "503 Service Unavailable");
7474
}
75-
const error = tryToErrorLike(await res.text());
76-
if (!error) {
75+
const value = tryToErrorLike(await res.text());
76+
if (!value) {
7777
throw makeCustomError(
7878
"UnexpectedError",
7979
`Unexpected error has occuerd when fetching "${path}"`,
8080
);
8181
}
82-
return { ok: false, ...error };
82+
return { ok: false, value };
8383
}
84-
const result = (await res.json()) as { message: string };
85-
return { ok: true, ...result };
84+
const { message } = (await res.json()) as { message: string };
85+
return { ok: true, value: message };
8686
}
8787

8888
/** `exportPages`の認証情報 */
@@ -119,18 +119,22 @@ export async function exportPages<withMetadata extends true | false>(
119119
return { ok: false, ...error };
120120
}
121121
if (!res.ok) {
122-
const error = tryToErrorLike(await res.text());
123-
if (!error) {
122+
const value = tryToErrorLike(await res.text()) as
123+
| false
124+
| NotFoundError
125+
| NotPrivilegeError
126+
| NotLoggedInError;
127+
if (!value) {
124128
throw makeCustomError(
125129
"UnexpectedError",
126130
`Unexpected error has occuerd when fetching "${path}"`,
127131
);
128132
}
129133
return {
130134
ok: false,
131-
...(error as NotFoundError | NotPrivilegeError | NotLoggedInError),
135+
value,
132136
};
133137
}
134-
const result = (await res.json()) as ExportedData<withMetadata>;
135-
return { ok: true, ...result };
138+
const value = (await res.json()) as ExportedData<withMetadata>;
139+
return { ok: true, value };
136140
}

rest/pages.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,22 @@ export async function getPage(
4949
);
5050

5151
if (!res.ok) {
52-
const error = tryToErrorLike(await res.text());
53-
if (!error) {
52+
const value = tryToErrorLike(await res.text()) as
53+
| false
54+
| NotFoundError
55+
| NotLoggedInError
56+
| NotMemberError;
57+
if (!value) {
5458
throw makeCustomError(
5559
"UnexpectedError",
5660
`Unexpected error has occuerd when fetching "${path}"`,
5761
);
5862
}
5963
return {
6064
ok: false,
61-
...(error as (NotFoundError | NotLoggedInError | NotMemberError)),
65+
value,
6266
};
6367
}
64-
const result = (await res.json()) as Page;
65-
return { ok: true, ...result };
68+
const value = (await res.json()) as Page;
69+
return { ok: true, value };
6670
}

rest/utils.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,23 @@ import type { ErrorLike } from "../deps/scrapbox.ts";
66
*/
77
export const cookie = (sid: string) => `connect.sid=${sid}`;
88

9-
export type Result<T, E> = ({ ok: true } & T) | ({ ok: false } & E);
9+
export type Result<T, E> = { ok: true; value: T } | { ok: false; value: E };
1010
/** CSRF tokenを取得する
1111
*
1212
* @param sid - connect.sidに入っている文字列。不正な文字列を入れてもCSRF tokenを取得できるみたい
1313
*/
1414
export async function getCSRFToken(
1515
sid: string,
16-
): Promise<Result<{ csrfToken: string }, ErrorLike>> {
16+
): Promise<Result<string, ErrorLike>> {
1717
const res = await fetch("https://scrapbox.io/api/users/me", {
1818
headers: { Cookie: cookie(sid) },
1919
});
2020
if (!res.ok) {
21-
const error = (await res.json()) as ErrorLike;
22-
return { ok: false, ...error };
21+
const value = (await res.json()) as ErrorLike;
22+
return { ok: false, value };
2323
}
2424
const { csrfToken } = (await res.json()) as { csrfToken: string };
25-
return { ok: true, csrfToken };
25+
return { ok: true, value: csrfToken };
2626
}
2727

2828
// cf. https://blog.uhy.ooo/entry/2021-04-09/typescript-is-any-as/#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%AE%9A%E7%BE%A9%E5%9E%8B%E3%82%AC%E3%83%BC%E3%83%89%E3%81%AE%E5%BC%95%E6%95%B0%E3%81%AE%E5%9E%8B%E3%82%92%E3%81%A9%E3%81%86%E3%81%99%E3%82%8B%E3%81%8B

0 commit comments

Comments
 (0)