53 lines
1.3 KiB
TypeScript
53 lines
1.3 KiB
TypeScript
import { ParseResult, Schema } from "@effect/schema"
|
|
import { DateTime } from "effect"
|
|
|
|
|
|
export const DateTimeUtcFromDate = Schema.transformOrFail(
|
|
Schema.DateFromSelf,
|
|
Schema.DateTimeUtcFromSelf,
|
|
|
|
{
|
|
strict: true,
|
|
|
|
decode: (date, _, ast) => ParseResult.try({
|
|
try: () => DateTime.unsafeMake(date),
|
|
|
|
catch: e => new ParseResult.Type(
|
|
ast,
|
|
date,
|
|
e instanceof Error ? e.message : undefined,
|
|
),
|
|
}),
|
|
|
|
encode: dateTimeUtc => ParseResult.succeed(
|
|
DateTime.toDateUtc(dateTimeUtc)
|
|
),
|
|
},
|
|
)
|
|
|
|
export const DateTimeZonedFromDate = (options: {
|
|
readonly timeZone: number | string | DateTime.TimeZone
|
|
readonly adjustForTimeZone?: boolean | undefined
|
|
}) => Schema.transformOrFail(
|
|
Schema.DateFromSelf,
|
|
Schema.DateTimeZonedFromSelf,
|
|
|
|
{
|
|
strict: true,
|
|
|
|
decode: (date, _, ast) => ParseResult.try({
|
|
try: () => DateTime.unsafeMakeZoned(date, options),
|
|
|
|
catch: e => new ParseResult.Type(
|
|
ast,
|
|
date,
|
|
e instanceof Error ? e.message : undefined,
|
|
),
|
|
}),
|
|
|
|
encode: dateTime => ParseResult.succeed(
|
|
DateTime.toDate(dateTime)
|
|
),
|
|
},
|
|
)
|