import { Effect, Schema } from "effect"
import { Rpc, RpcGroup } from "effect/unstable/rpc"
class User extends Schema.Class<User>("User")({
id: Schema.Number,
name: Schema.String,
email: Schema.String
}) {}
class UserNotFound extends Schema.TaggedErrorClass<UserNotFound>()("UserNotFound", {
userId: Schema.Number
}) {}
export const GetUser = Rpc.make("GetUser", {
payload: { id: Schema.Number },
success: User,
failure: UserNotFound
})
export const ListUsers = Rpc.make("ListUsers", {
success: Schema.Array(User)
})
export const CreateUser = Rpc.make("CreateUser", {
payload: {
name: Schema.String,
email: Schema.String
},
success: User
})
export class UsersRpc extends RpcGroup.make("Users")(
GetUser,
ListUsers,
CreateUser
) {}
// Implement handlers
const handlers = {
GetUser: ({ payload }) =>
Effect.gen(function*() {
if (payload.id === 1) {
return { id: 1, name: "Alice", email: "[email protected]" }
}
return yield* new UserNotFound({ userId: payload.id })
}),
ListUsers: () =>
Effect.succeed([
{ id: 1, name: "Alice", email: "[email protected]" },
{ id: 2, name: "Bob", email: "[email protected]" }
]),
CreateUser: ({ payload }) =>
Effect.succeed({
id: Date.now(),
name: payload.name,
email: payload.email
})
}