This is the cleanest option when your client’s error channel contains several error types and you want distinct recovery strategies for each.
import { FetchHttpClient, HttpClient, HttpClientRequest, HttpClientResponse,} from "effect/unstable/http";import { Effect, Schema } from "effect";
const User = Schema.Struct({ id: Schema.Number, firstName: Schema.String, lastName: Schema.String,});
function fetchUser(userId: number) { return Effect.gen(function* () { const client = (yield* HttpClient.HttpClient).pipe( HttpClient.filterStatusOk, HttpClient.catchTags({ HttpClientError: (error) => Effect.gen(function* () { console.log(`HTTP error: ${error.message}`); console.log("Falling back to default user..."); const fallbackClient = yield* HttpClient.HttpClient; return yield* fallbackClient.get("https://dummyjson.com/users/1"); }), }), );
const request = HttpClientRequest.get( `https://dummyjson.com/users/${userId}`, );
const response = yield* client.execute(request); const user = yield* HttpClientResponse.schemaBodyJson(User)(response);
return user; }).pipe(Effect.provide(FetchHttpClient.layer));}
// Test with an invalid user — HttpClientError is caught, fallback is usedEffect.runPromise(fetchUser(9999)).then( (user) => console.log("User:", user.firstName, user.lastName), (error) => console.error(`[${error._tag}] ${error.message}`),);Output:
HTTP error: StatusCode: non 2xx status code (404 GET https://dummyjson.com/users/9999)Falling back to default user...User: Emily JohnsonIn this example, HttpClientError is caught and recovered with a fallback request. But SchemaError (from schemaBodyJson) is not listed, so it would propagate to the caller if the response shape doesn’t match the schema.