bluecodex
Version:
Turn repetitive dev tasks into CLI commands with Typescript
53 lines (48 loc) • 1.48 kB
text/typescript
import type { StringToNumber } from "../types/string-type-utils";
import type { DataType } from "./data-type";
import {
type DataTypeToken,
type FalsyValue,
type TruthyValue,
falsyValues,
truthyValues,
} from "./data-type-token";
import { DataTypeCastBooleanError } from "./errors/data-type-cast-boolean-error";
import { DataTypeCastNumberError } from "./errors/data-type-cast-number-error";
export type CastData<
DT extends DataTypeToken,
ValueToken extends string | null,
> = ValueToken extends string
? DT extends "string"
? ValueToken
: DT extends "number"
? StringToNumber<ValueToken, DataTypeCastNumberError<ValueToken>>
: DT extends "boolean"
? ValueToken extends TruthyValue
? true
: ValueToken extends FalsyValue
? false
: DataTypeCastBooleanError<ValueToken>
: never
: null;
export function castData<DT extends DataTypeToken>({
type,
input,
}: {
type: DT;
input: string;
}): DataType<DT> {
switch (type) {
case "string":
return input as DataType<DT>;
case "number": {
const numberCast = Number(input);
if (isNaN(numberCast)) throw new DataTypeCastNumberError(input);
return numberCast as DataType<DT>;
}
case "boolean":
if (truthyValues.includes(input)) return true as DataType<DT>;
if (falsyValues.includes(input)) return false as DataType<DT>;
throw new DataTypeCastBooleanError(input);
}
}