Co-authored-by: Julien Valverdé <julien.valverde@mailo.com> Reviewed-on: https://gitea:3000/Thilawyn/effect-fc/pulls/4
39 lines
1.2 KiB
TypeScript
39 lines
1.2 KiB
TypeScript
import { DateTime, Effect, Option, ParseResult, Schema } from "effect"
|
|
|
|
|
|
export class DateTimeUtcFromZoned extends Schema.transformOrFail(
|
|
Schema.DateTimeZonedFromSelf,
|
|
Schema.DateTimeUtcFromSelf,
|
|
{
|
|
strict: true,
|
|
encode: DateTime.setZoneCurrent,
|
|
decode: i => ParseResult.succeed(DateTime.toUtc(i)),
|
|
},
|
|
) {}
|
|
|
|
export class DateTimeZonedFromUtc extends Schema.transformOrFail(
|
|
Schema.DateTimeUtcFromSelf,
|
|
Schema.DateTimeZonedFromSelf,
|
|
{
|
|
strict: true,
|
|
encode: a => ParseResult.succeed(DateTime.toUtc(a)),
|
|
decode: DateTime.setZoneCurrent,
|
|
},
|
|
) {}
|
|
|
|
export class DateTimeUtcFromZonedInput extends Schema.transformOrFail(
|
|
Schema.String,
|
|
DateTimeUtcFromZoned,
|
|
{
|
|
strict: true,
|
|
encode: a => ParseResult.succeed(DateTime.formatIsoZoned(a).slice(0, 16)),
|
|
decode: (i, _, ast) => Effect.flatMap(
|
|
DateTime.CurrentTimeZone,
|
|
timeZone => Option.match(DateTime.makeZoned(i, { timeZone, adjustForTimeZone: true }), {
|
|
onSome: ParseResult.succeed,
|
|
onNone: () => ParseResult.fail(new ParseResult.Type(ast, i, `Unable to decode ${JSON.stringify(i)} into a DateTime.Zoned`)),
|
|
}),
|
|
),
|
|
},
|
|
) {}
|