import { flow } from "effect" import { Option, S } from "effect-app" import type { Schema } from "effect-app/Schema" import { typedKeysOf } from "effect-app/utils" import type { ParsedQuery } from "query-string" export function getQueryParam(search: ParsedQuery, param: string) { const v = search[param] if (Array.isArray(v)) { return v[0] } return v ?? null } export const getQueryParamO = flow(getQueryParam, Option.fromNullishOr) export function parseRouteParamsOption>>(query: Record, t: NER // enforce non empty ): { [K in keyof NER]: Option.Option> } { return typedKeysOf(t).reduce( (prev, cur) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion prev[cur] = getQueryParamO(query, cur as string).pipe( Option.flatMap(S.decodeUnknownOption(t[cur]!)) ) return prev }, {} as { [K in keyof NER]: Option.Option> } ) } export function parseRouteParams>>( query: Record, t: NER // enforce non empty ): { [K in keyof NER]: Schema.Type } { return typedKeysOf(t).reduce( (prev, cur) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion prev[cur] = S.decodeUnknownSync(t[cur]!)( (query as any)[cur] ) return prev }, {} as { [K in keyof NER]: Schema.Type } ) }