Effect CommunityEC
Effect Community3y ago
20 replies
Sadra

Mind-blowing code and seeking better solution for error handling

This part of my code is mind-blowing. Does anyone have a better solution for this situation?

type ResJson = {
  ok: boolean;
  error:
    | "ParseJsonError"
    | "InvalidInputError"
    | "TitleNotExistsError"
    | "TitleUsedBeforeError"
    | "AdminNotFoundError";
};

const errObj = {
  ParseJsonError: class ParseJsonError extends Data.TaggedError(
    "ParseJsonError",
  )<{}> {},
  InvalidInputError: class InvalidInputError extends Data.TaggedError(
    "InvalidInputError",
  )<{}> {},
  TitleNotExistsError: class TitleNotExistsError extends Data.TaggedError(
    "TitleNotExistsError",
  )<{}> {},
  TitleUsedBeforeError: class TitleUsedBeforeError extends Data.TaggedError(
    "TitleUsedBeforeError",
  )<{}> {},
  AdminNotFoundError: class AdminNotFoundError extends Data.TaggedError(
    "AdminNotFoundError",
  )<{}> {},
} as const;

class TitlesResponseError extends Data.TaggedError("TitlesResponseError")<{}> {}

const modifyTitles = (title: string, titleId: number, user: string) => {
  return Effect.tryPromise({
    try: () =>
      axios.post<ResJson>(
        "http://localhost:5173/used",
        { auth: "something", title, titleId, user },
        { headers: { "Content-Type": "application/json" } },
      ),
    catch: () => new TitlesResponseError(),
  }).pipe(
    Effect.filterOrFail(
      (x) => x.data.ok,
      (res) => errObj[res.data.error],
    ),
  );
};
Was this page helpful?