import { Either, type IEither } from "@emprespresso/pengueno"; export const getRequiredEnv = (name: V): IEither => Either.fromFailable(() => Deno.env.get(name) as V | undefined) // could throw when no permission. .flatMap( (v) => (v && Either.right(v)) || Either.left(new Error(`environment variable "${name}" is required D:`)) ); type ObjectFromList, V = string> = { [K in T extends ReadonlyArray ? U : never]: V; }; export const getRequiredEnvVars = (vars: ReadonlyArray) => vars .map((envVar) => [envVar, getRequiredEnv(envVar)] as [V, IEither]) .reduce( ( acc: IEither>, x: [V, IEither], ) => { const [envVar, eitherVal] = x; return acc.flatMap((args) => { return eitherVal.mapRight( (envValue) => ({ ...args, [envVar]: envValue, }) as ObjectFromList, ); }); }, Either.right({} as ObjectFromList), );