import { Effect, Data, Schema } from 'effect';
class HttpError extends Data.TaggedError('HttpError')<{
cause: unknown
}> {}
class JsonParseError extends Data.TaggedError('JsonParseError')<{
cause: unknown
}> {}
const getUrl = Effect.gen(function* () {
return 'https://jsonplaceholder.typicode.com/todos'
})
const TodoSchema = Schema.Struct({
userId: Schema.Number,
id: Schema.Number,
title: Schema.String,
completed: Schema.Boolean,
})
const TodoResponseSchema = Schema.Array(TodoSchema)
// infered signature: Effect<Todo[], never, unknown> !
export const fetchTodos = Effect.gen(function* () {
const url = yield* getUrl
const response = yield* Effect
.tryPromise({
try: () => fetch(url),
catch: (error) => {
throw new HttpError({ cause: error })
},
})
const todoJson = yield* Effect.tryPromise({
try: () => response.json(),
catch: (error) => {
throw new JsonParseError({ cause: error })
},
})
return Schema.decodeUnknownSync(TodoResponseSchema)(todoJson)
})
import { Effect, Data, Schema } from 'effect';
class HttpError extends Data.TaggedError('HttpError')<{
cause: unknown
}> {}
class JsonParseError extends Data.TaggedError('JsonParseError')<{
cause: unknown
}> {}
const getUrl = Effect.gen(function* () {
return 'https://jsonplaceholder.typicode.com/todos'
})
const TodoSchema = Schema.Struct({
userId: Schema.Number,
id: Schema.Number,
title: Schema.String,
completed: Schema.Boolean,
})
const TodoResponseSchema = Schema.Array(TodoSchema)
// infered signature: Effect<Todo[], never, unknown> !
export const fetchTodos = Effect.gen(function* () {
const url = yield* getUrl
const response = yield* Effect
.tryPromise({
try: () => fetch(url),
catch: (error) => {
throw new HttpError({ cause: error })
},
})
const todoJson = yield* Effect.tryPromise({
try: () => response.json(),
catch: (error) => {
throw new JsonParseError({ cause: error })
},
})
return Schema.decodeUnknownSync(TodoResponseSchema)(todoJson)
})