Effect CommunityEC
Effect Community2y ago
49 replies
John G

Mapping Schema to Tagged Data

Hello all, how can I map schema to arbitrary structure, for example Tagged Data
import { Data } from 'effect';
import { Schema as S } from '@effect/schema';

export const ApiErrror = Data.taggedEnum<ApiErrror>();
export type ApiErrror = Data.TaggedEnum<{
  BadRequest: { code: 400; message: string };
  LoginFailed: { code: 401; mesasge: string };
}>;

const badRequestSchema = S.struct({
  statusCode: S.literal(400),
  message: S.string,
}) 
// map
// ({statusCode, message}) => ApiError.BadRequest({code : statusCode, message})

const loginFailedSchema = S.struct({
  statusCode: S.literal(401),
  message: S.string,
})
// map
// ({statusCode, message}) => ApiError.LoginFailed({code : statusCode, message})

const apiResponseSchema = S.union(badRequestSchema, loginFailedSchema);

// (_: unknown) => ApiError 
const parse = S.parseEither(apiResponseSchema);

Or maybe there is a better way to achieve this?
Was this page helpful?