import { Result } from 'ts-data-forge';
import { type Primitive } from 'ts-type-forge';
import { type Type } from '../type.mjs';
import { createAssertFn } from './create-assert-fn.mjs';
import { createCastFn } from './create-cast-fn.mjs';
import { createPrimitiveValidationError } from './validation-error.mjs';
export const createPrimitiveType = ({
defaultValue,
is,
typeName,
}: Readonly<{
typeName: string;
defaultValue: A;
is: (value: unknown) => value is A;
}>): Type => {
const validate: Type['validate'] = (a) =>
is(a)
? Result.ok(a)
: Result.err([
createPrimitiveValidationError({
actualValue: a,
expectedType: typeName,
typeName,
details: undefined,
}),
]);
return {
typeName,
defaultValue,
is,
fill: (a) => (is(a) ? a : defaultValue),
prune: (a) => a,
validate,
assertIs: createAssertFn(validate),
cast: createCastFn(validate),
};
};