import * as S from '@effect/schema/Schema';
import * as Option from 'effect/Option';
// What my API need
const apiStruct = S.Struct({
id: S.Number,
fields: S.Struct({
assignee: S.optional(S.Struct({ displayName: S.String }), { as: 'Option' }),
}),
});
// What I would like to use in my app
const appStruct = S.Struct({
id: S.Number,
assignee: S.Option(S.String),
});
const transformSchema = S.transform(apiStruct, appStruct, {
decode: ({ id, fields: { assignee: assigneeOpt } }) => ({
// assigneeOpt is an Option<string>
id,
assignee: Option.map(assigneeOpt, (a) => a.displayName),
}),
encode: ({ id, assignee: assigneeOpt }) => ({
// assigneeOpt is an OptionEncoded ??
id,
fields: Option.match(assigneeOpt, {
onNone: () => ({}),
onSome: (a) => ({ assignee: { displayName: a } }),
}),
})
});
console.log(
S.decode(transformSchema)({
id: 123,
fields: { assignee: { displayName: 'helen' } },
}),
); // <-- ParseError
console.log(
S.encode(transformSchema)({
id: 123,
assignee: Option.some('helen'),
}),
); // <-- ParseError
import * as S from '@effect/schema/Schema';
import * as Option from 'effect/Option';
// What my API need
const apiStruct = S.Struct({
id: S.Number,
fields: S.Struct({
assignee: S.optional(S.Struct({ displayName: S.String }), { as: 'Option' }),
}),
});
// What I would like to use in my app
const appStruct = S.Struct({
id: S.Number,
assignee: S.Option(S.String),
});
const transformSchema = S.transform(apiStruct, appStruct, {
decode: ({ id, fields: { assignee: assigneeOpt } }) => ({
// assigneeOpt is an Option<string>
id,
assignee: Option.map(assigneeOpt, (a) => a.displayName),
}),
encode: ({ id, assignee: assigneeOpt }) => ({
// assigneeOpt is an OptionEncoded ??
id,
fields: Option.match(assigneeOpt, {
onNone: () => ({}),
onSome: (a) => ({ assignee: { displayName: a } }),
}),
})
});
console.log(
S.decode(transformSchema)({
id: 123,
fields: { assignee: { displayName: 'helen' } },
}),
); // <-- ParseError
console.log(
S.encode(transformSchema)({
id: 123,
assignee: Option.some('helen'),
}),
); // <-- ParseError