// Draft and Published look like: { id: string; type: draft|published }
// The union can differentiate on the `type`
export const User = S.Union(
Draft,
Published,
);
export const onUser = Match.typeTags<User>();
const UserPgTransform = S.transform(
User,
{
strict: true,
encode: (user) => {
switch (user.status) {
case "draft":
return new Draft(user);
case "published":
return new Published();
}
},
decode: onUser({
// Match on tagged class
Draft: (user) => {
id: user.id,
status: 'draft',
// Convert DateTime.now -> JS date
createdAt: user.createdAt
},
Published: () => {
id: user.id,
status: 'published',
// Convert DateTime.now -> JS date
createdAt: user.createdAt
}
}),
},
);
// Draft and Published look like: { id: string; type: draft|published }
// The union can differentiate on the `type`
export const User = S.Union(
Draft,
Published,
);
export const onUser = Match.typeTags<User>();
const UserPgTransform = S.transform(
User,
{
strict: true,
encode: (user) => {
switch (user.status) {
case "draft":
return new Draft(user);
case "published":
return new Published();
}
},
decode: onUser({
// Match on tagged class
Draft: (user) => {
id: user.id,
status: 'draft',
// Convert DateTime.now -> JS date
createdAt: user.createdAt
},
Published: () => {
id: user.id,
status: 'published',
// Convert DateTime.now -> JS date
createdAt: user.createdAt
}
}),
},
);