import type { CellValue } from '../SheetData.d.js' import type { StringType, DateType, NumberType, BooleanType, Integer, Email, URL, ParseSheetDataCustomType, ParseSheetDataValueType } from './parseSheetDataValueType.d.js' export interface ParseSheetDataValueRequiredError< ColumnTitle extends string = string, CustomType extends ParseSheetDataCustomType = never > { row: number; column: ColumnTitle; columnIndex: number; error: 'required'; reason: undefined; // When `error` is `"required"`, `value` could only be `null` or `undefined`. // * `null` means "cell is empty" // * `undefined` means "column is missing" value: null | undefined; // When `type` is not specified, it assumes `type: String`. type?: ParseSheetDataValueType; } interface ParseSheetDataError_< ColumnTitle extends string, // ` | undefined` is added to support `parseSheetData()` errors that originate // on properties that have no `type` property specified. In such cases, // `type` defaults to `String`. // // One could ask: "Why is then the `type` not simply marked as optional?". // The answer is that `type` could only be `undefined` in case of `parseSheetData()` errors // that originate from `type: String` parser while other type parsers can't have `type` be `undefined`. // ValueType extends ParseSheetDataValueType | undefined, ErrorMessage extends string, ErrorReason extends string | undefined > { row: number; column: ColumnTitle; columnIndex: number; error: ErrorMessage; reason: ErrorReason; // When `error` is not `"required"`, `value` is known to not be `null` or `undefined` // because when `value` is `null` or `undefined`, it won't be parsed at all, // so there can't be any error thrown during parsing phase. value: CellValue; type: ValueType; } export type ParseSheetDataCustomTypeErrorMessage< CustomType extends ParseSheetDataCustomType > = string export type ParseSheetDataCustomTypeErrorReason< CustomType extends ParseSheetDataCustomType, ErrorMessage extends ParseSheetDataCustomTypeErrorMessage > = string | undefined // This is just a public export. It's not used internally. interface ParseSheetDataErrorCustomType< ColumnTitle extends string = string, CustomType extends ParseSheetDataCustomType = never, ErrorMessage extends ParseSheetDataCustomTypeErrorMessage = string, ErrorReason extends ParseSheetDataCustomTypeErrorReason = string | undefined > extends ParseSheetDataError_< ColumnTitle, CustomType, ErrorMessage, ErrorReason > {} interface ParseSheetDataErrorNotABoolean extends ParseSheetDataError_< ColumnTitle, BooleanType, 'not_a_boolean', undefined > { value: Exclude; } interface ParseSheetDataErrorNotADate extends ParseSheetDataError_< ColumnTitle, DateType, 'not_a_date', undefined > { value: Exclude; } interface ParseSheetDataErrorDateOutOfBounds extends ParseSheetDataError_< ColumnTitle, DateType, 'out_of_bounds', undefined > { value: typeof Date; } interface ParseSheetDataErrorNotAString extends ParseSheetDataError_< ColumnTitle, StringType | undefined, 'not_a_string', undefined > { value: Exclude; } interface ParseSheetDataErrorStringInvalidNumber extends ParseSheetDataError_< ColumnTitle, StringType | undefined, 'invalid_number', undefined > { value: number; } interface ParseSheetDataErrorStringNumberOutOfBounds extends ParseSheetDataError_< ColumnTitle, StringType | undefined, 'out_of_bounds', undefined > { value: number; } interface ParseSheetDataErrorNotANumber< ColumnTitle extends string = string, ValueType extends ParseSheetDataCustomType | undefined = NumberType > extends ParseSheetDataError_< ColumnTitle, ValueType, 'not_a_number', undefined > { value: Exclude; } interface ParseSheetDataErrorNotANumberString< ColumnTitle extends string = string, ValueType extends ParseSheetDataCustomType | undefined = NumberType > extends ParseSheetDataError_< ColumnTitle, ValueType, 'not_a_number', undefined > { value: string; } interface ParseSheetDataErrorNumberInvalid< ColumnTitle extends string = string, ValueType extends ParseSheetDataCustomType | undefined = NumberType > extends ParseSheetDataError_< ColumnTitle, ValueType, 'invalid_number', undefined > { value: number | string; } interface ParseSheetDataErrorNumberOutOfBounds< ColumnTitle extends string = string, ValueType extends ParseSheetDataCustomType | undefined = NumberType > extends ParseSheetDataError_< ColumnTitle, ValueType, 'out_of_bounds', undefined > { value: number | string; } type ParseSheetDataBaseValueTypeError = | ParseSheetDataErrorNotABoolean | ParseSheetDataErrorNotADate | ParseSheetDataErrorDateOutOfBounds | ParseSheetDataErrorNotAString | ParseSheetDataErrorStringInvalidNumber | ParseSheetDataErrorStringNumberOutOfBounds | ParseSheetDataErrorNotANumber | ParseSheetDataErrorNotANumberString | ParseSheetDataErrorNumberInvalid | ParseSheetDataErrorNumberOutOfBounds; interface ParseSheetDataErrorNotAnInteger extends ParseSheetDataError_< ColumnTitle, typeof Integer, 'not_an_integer', undefined > { value: number | string; } interface ParseSheetDataErrorIntegerNotANumber extends ParseSheetDataErrorNotANumber {} interface ParseSheetDataErrorIntegerNotANumberString extends ParseSheetDataErrorNotANumberString {} interface ParseSheetDataErrorIntegerNumberInvalid extends ParseSheetDataErrorNumberInvalid {} interface ParseSheetDataErrorIntegerNumberOutOfBounds extends ParseSheetDataErrorNumberOutOfBounds {} interface ParseSheetDataErrorNotAUrl extends ParseSheetDataError_< ColumnTitle, typeof URL, 'not_a_url', undefined > { value: string; } interface ParseSheetDataErrorUrlNotAString extends ParseSheetDataError_< ColumnTitle, typeof URL, 'not_a_string', undefined > { value: Exclude; } interface ParseSheetDataErrorNotAnEmail extends ParseSheetDataError_< ColumnTitle, typeof Email, 'not_an_email', undefined > { value: string; } interface ParseSheetDataErrorEmailNotAString extends ParseSheetDataError_< ColumnTitle, typeof Email, 'not_a_string', undefined > { value: Exclude; } type ParseSheetDataAdditionalValueTypeError = | ParseSheetDataErrorNotAnInteger | ParseSheetDataErrorIntegerNotANumber | ParseSheetDataErrorIntegerNotANumberString | ParseSheetDataErrorIntegerNumberInvalid | ParseSheetDataErrorIntegerNumberOutOfBounds | ParseSheetDataErrorNotAUrl | ParseSheetDataErrorUrlNotAString | ParseSheetDataErrorNotAnEmail | ParseSheetDataErrorEmailNotAString; type ParseSheetDataBuiltInValueTypeError = | ParseSheetDataBaseValueTypeError | ParseSheetDataAdditionalValueTypeError; interface ParseSheetDataArrayValueNotAStringError< ColumnTitle extends string = string, ParseSheetDataCustomType_ extends ParseSheetDataCustomType = ParseSheetDataCustomType > extends ParseSheetDataError_< ColumnTitle, ParseSheetDataValueType, 'not_a_string', undefined > {} interface ParseSheetDataArrayValueSyntaxError< ColumnTitle extends string = string, ParseSheetDataCustomType_ extends ParseSheetDataCustomType = ParseSheetDataCustomType > extends ParseSheetDataError_< ColumnTitle, ParseSheetDataValueType, 'invalid', 'syntax' > {} export type ParseSheetDataError< ColumnTitle extends string = string, CustomType extends ParseSheetDataCustomType = never, ErrorMessage extends ParseSheetDataCustomTypeErrorMessage = string, ErrorReason extends ParseSheetDataCustomTypeErrorReason = string | undefined > = | ParseSheetDataBuiltInValueTypeError | ParseSheetDataValueRequiredError> | ParseSheetDataArrayValueNotAStringError> | ParseSheetDataArrayValueSyntaxError> | ParseSheetDataErrorCustomType< ColumnTitle, ParseSheetDataValueType, ErrorMessage, ErrorReason >;