Issues with context provision in TypeScript Effect library function
what I am doing wrong here? in the api function? is it how I provide the context?
class DataFetchingConfigContext
extends Context.Tag("DatafetchingConfigContext")<
DataFetchingConfigContext,
typeof DataFetchingConfig.Type
>() {}
const DataFetchingConfigLive = Layer.effect(
DataFetchingConfigContext,
Effect.gen(function* () {
return yield* S.decodeUnknown(DataFetchingConfig)(dataConfig);
}),
);
const Fetch = Context.GenericTag<"Fetch", typeof fetch>("Fetch");
const api = (
endpoint: string,
errorMessage: string,
): Effect.Effect<unknown, Error, "Fetch" | DataFetchingConfigContext> =>
Effect.gen(function* () {
const config = yield* DataFetchingConfigLive;
const baseUrl = `${config.csgo_api.url}/${config.csgo_api.lang}`;
const url =`${baseUrl}/${endpoint}.json`
return yield* Fetch.pipe(Effect.flatMap((fetch) =>
pipe(
Effect.tryPromise({
try: () => fetch(url),
catch: (e) => new Error(`${errorMessage}`, { cause: e }),
}),
Effect.andThen((res) =>
res.ok
? Effect.tryPromise({
try: () => res.json(),
catch: (e) =>
new Error(`Error parsing ${endpoint} json`, { cause: e }),
})
: Effect.fail(new Error(`Error ${res.status}`, { cause: res }))
),
)
));
});class DataFetchingConfigContext
extends Context.Tag("DatafetchingConfigContext")<
DataFetchingConfigContext,
typeof DataFetchingConfig.Type
>() {}
const DataFetchingConfigLive = Layer.effect(
DataFetchingConfigContext,
Effect.gen(function* () {
return yield* S.decodeUnknown(DataFetchingConfig)(dataConfig);
}),
);
const Fetch = Context.GenericTag<"Fetch", typeof fetch>("Fetch");
const api = (
endpoint: string,
errorMessage: string,
): Effect.Effect<unknown, Error, "Fetch" | DataFetchingConfigContext> =>
Effect.gen(function* () {
const config = yield* DataFetchingConfigLive;
const baseUrl = `${config.csgo_api.url}/${config.csgo_api.lang}`;
const url =`${baseUrl}/${endpoint}.json`
return yield* Fetch.pipe(Effect.flatMap((fetch) =>
pipe(
Effect.tryPromise({
try: () => fetch(url),
catch: (e) => new Error(`${errorMessage}`, { cause: e }),
}),
Effect.andThen((res) =>
res.ok
? Effect.tryPromise({
try: () => res.json(),
catch: (e) =>
new Error(`Error parsing ${endpoint} json`, { cause: e }),
})
: Effect.fail(new Error(`Error ${res.status}`, { cause: res }))
),
)
));
});