pure-parse
Version:
Strongly typed validation library that decouples type aliases from validation logic
105 lines (104 loc) • 2.63 kB
TypeScript
/**
* The data adheres to the schema. The `value` is equal to the parsed data
*/
export type ParseSuccess<T> = {
tag: 'success';
value: T;
error?: never;
};
/**
* The parsing failed.
*/
export type ParseFailure = {
tag: 'failure';
error: Failure;
};
export type Failure = {
message: string;
path: PathSegment[];
};
/**
* Describes the path in a data structure where parsing failed.
*/
export type PathSegment = {
tag: 'object';
key: string;
} | {
tag: 'array';
index: number;
};
/**
* Describes the result of a parsing operation.
* The `tag` and `error` properties can be used to distinguish between success and failure.
* @example
* Use `error` to distinguish between success and failure:
* ```ts
* const result = parseNumber(data)
* if(result.error) {
* console.error(formatResult(result))
* return
* }
* console.log(result.value)
* ```
* @example
* Use `tag` to distinguish between success and failure:
* ```ts
* const result = parseNumber(data)
* switch (result.tag) {
* case 'failure':
* console.error(formatResult(result))
* break
* case 'success':
* console.log(result.value)
* break
*/
export type ParseResult<T> = ParseSuccess<T> | ParseFailure;
/**
* *****************************
* Utilities
* *****************************
*/
/**
* Create a successful parsing result.
* @example
* ```ts
* const customParser: Parser<number> = (data) => {
* if (typeof data === 'number') {
* return success(data)
* }
* return failure('Expected a number')
* }
* @param value
*/
export declare const success: <T>(value: T) => ParseSuccess<T>;
/**
* Create a failure parsing result.
* @example
* ```ts
* const customParser: Parser<number> = (data) => {
* if (typeof data === 'number') {
* return success(data)
* }
* return failure('Expected a number')
* }
* ```
* @param message
*/
export declare const failure: (message: string) => ParseFailure;
/**
* Check if the result is a success
* @param result
*/
export declare const isSuccess: <T>(result: ParseResult<T>) => result is ParseSuccess<T>;
/**
* Check if the result is a failure
* @param result
*/
export declare const isFailure: <T>(result: ParseResult<T>) => result is ParseFailure;
/**
* Propagate a failure result in a nested structure.
* When parsing objects and arrays with nested values, the failure at the root level should convey where in the hierarchy the failure occurred.
* @param failureRes
* @param pathSegment
*/
export declare const propagateFailure: (failureRes: ParseFailure, pathSegment: PathSegment) => ParseFailure;