You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.3 KiB
50 lines
1.3 KiB
export const identity = <T>(value: T) => value;
|
|
|
|
export const createTargetHelpers = <TTarget>(
|
|
missingValueIndicators: unknown[],
|
|
) => {
|
|
const createRequiredField = <
|
|
TKey extends string & keyof TTarget,
|
|
TRawValue,
|
|
>(
|
|
key: TKey,
|
|
value: TRawValue,
|
|
transformer: (value: TRawValue) => TTarget[TKey],
|
|
) => {
|
|
if (value === undefined) {
|
|
throw new Error(`Value for ${key} is not defined`);
|
|
}
|
|
|
|
if (missingValueIndicators.includes(value)) {
|
|
throw new Error(`Missing value for ${key}`);
|
|
}
|
|
|
|
return {
|
|
[key]: transformer(value),
|
|
} as Record<TKey, TTarget[TKey]>;
|
|
};
|
|
|
|
const createOptionalField = <
|
|
TKey extends string & keyof TTarget,
|
|
TRawValue,
|
|
>(
|
|
key: TKey,
|
|
value: TRawValue,
|
|
transformer: (value: Exclude<TRawValue, undefined>) => TTarget[TKey],
|
|
) => {
|
|
if (value === undefined || missingValueIndicators.includes(value)) {
|
|
return undefined;
|
|
}
|
|
|
|
return createRequiredField(
|
|
key,
|
|
value as Exclude<TRawValue, undefined>,
|
|
transformer,
|
|
);
|
|
};
|
|
|
|
return {
|
|
createRequiredField,
|
|
createOptionalField,
|
|
};
|
|
};
|
|
|