import { IOptional, Either, Optional, type IEither, type ObjectFromList } from '@emprespresso/pengueno'; // type safe environment variables export const getEnv = (name: string): IOptional => Optional.from(process.env[name]); export const getRequiredEnv = (name: V): IEither => Either.fromFailable(() => getEnv(name).get()).mapLeft( () => new Error(`environment variable "${name}" is required D:`), ); export const getRequiredEnvVars = (vars: Array): IEither> => { type Environment = ObjectFromList; const emptyEnvironment = Either.right({}); const addTo = (env: Environment, key: V, val: string) => { ...env, [key]: val, }; return vars.reduce( (environment, key) => environment.joinRight(getRequiredEnv(key), (value, environment) => addTo(environment, key, value)), emptyEnvironment, ); };