Syntax for Layer.mock with Additional Layers in Effect TypeScript

I'm struggling w/ the syntax for Layer.mock when it requires additonal layers.

import { Console, Context, Effect, Layer } from "effect";
import type { User } from "../types/User";
import { DatabaseService } from "./DatabaseService";

export class EmailService extends Context.Tag("app/EmailService")<
    EmailService,
    {
        readonly sendEmail: (
            user: User,
        ) => Effect.Effect<boolean, never, DatabaseService>;
    }
>() {}

export const EmailServiceTest = Layer.mock(EmailService, {
    sendEmail: (user) =>
        Effect.gen(function* () {
            const dbService = yield* DatabaseService;
            const db = yield* dbService.db;
            yield* Console.log(`Mock: Sending email to ${user.email} with db: ${db}`);
            return true;
        }).pipe(
            Effect.withSpan("EmailService.sendEmail", {
                attributes: {
                    "service.name": "EmailService",
                    "operation.name": "sendEmail",
                    "operation.type": "notification",
                    "email.to": user.email,
                },
            }),
        ),
});
Was this page helpful?