summaryrefslogtreecommitdiff
path: root/u/process/env.ts
blob: c0d893c671b4d0f6f7a00f487adad1eaa5d7cd59 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import { Either, type IEither } from "@emprespresso/pengueno";

export const getRequiredEnv = <V extends string>(name: V): IEither<Error, V> =>
  Either.fromFailable<Error, V>(() => Deno.env.get(name) as V) // could throw when no permission.
    .flatMap(
      (v) =>
        (v && Either.right(v)) ||
        Either.left(new Error(`environment variable "${name}" is required D:`)),
    );

type ObjectFromList<T extends ReadonlyArray<string>, V = string> = {
  [K in T extends ReadonlyArray<infer U> ? U : never]: V;
};

export const getRequiredEnvVars = <V extends string>(vars: ReadonlyArray<V>) =>
  vars
    .map((envVar) => [envVar, getRequiredEnv(envVar)] as [V, IEither<Error, V>])
    .reduce(
      (
        acc: IEither<Error, ObjectFromList<typeof vars>>,
        x: [V, IEither<Error, V>],
      ) => {
        const [envVar, eitherVal] = x;
        return acc.flatMap((args) => {
          return eitherVal.mapRight(
            (envValue) =>
              ({
                ...args,
                [envVar]: envValue,
              }) as ObjectFromList<typeof vars>,
          );
        });
      },
      Either.right({} as ObjectFromList<typeof vars>),
    );