@typed/fp
Version:
Data Structures and Resources for fp-ts
174 lines • 4.26 kB
JavaScript
/**
* DecodeError representation of the various errors that might occur while decoding.
* @since 0.9.4
*/
import { flow, pipe } from 'fp-ts/function';
import * as RA from 'fp-ts/ReadonlyArray';
import * as T from 'fp-ts/Tree';
/**
* @category constructors
* @since 0.9.4
*/
export const leaf = (actual, error) => ({
_tag: 'Leaf',
actual,
error,
});
/**
* @category constructors
* @since 0.9.4
*/
export const key = (key, errors) => ({
_tag: 'Key',
key,
errors,
});
/**
* @category constructors
* @since 0.9.4
*/
export const missingKeys = (keys) => ({
_tag: 'MissingKeys',
keys,
});
/**
* @category constructors
* @since 0.9.4
*/
export const unexpectedKeys = (keys) => ({
_tag: 'UnexpectedKeys',
keys,
});
/**
* @category constructors
* @since 0.9.4
*/
export const index = (index, errors) => ({
_tag: 'Index',
index,
errors,
});
/**
* @category constructors
* @since 0.9.4
*/
export const missingIndexes = (indexes) => ({
_tag: 'MissingIndexes',
indexes,
});
/**
* @category constructors
* @since 0.9.4
*/
export const unexpectedIndexes = (indexes) => ({
_tag: 'UnexpectedIndexes',
indexes,
});
/**
* @category constructors
* @since 0.9.4
*/
export const member = (index, errors) => ({
_tag: 'Member',
index,
errors,
});
/**
* @category constructors
* @since 0.9.4
*/
export const lazy = (id, errors) => ({
_tag: 'Lazy',
id,
errors,
});
/**
* @category constructors
* @since 2.2.9
*/
export const wrap = (error, errors) => ({
_tag: 'Wrap',
error,
errors,
});
/**
* @category destructors
* @since 0.9.4
*/
export const match = (patterns) => {
const f = (e) => {
switch (e._tag) {
case 'Leaf':
return patterns.Leaf(e.actual, e.error);
case 'Key':
return patterns.Key(e.key, e.errors);
case 'MissingKeys':
return patterns.MissingKeys(e.keys);
case 'UnexpectedKeys':
return patterns.UnexpectedKeys(e.keys);
case 'Index':
return patterns.Index(e.index, e.errors);
case 'MissingIndexes':
return patterns.MissingIndexes(e.indexes);
case 'UnexpectedIndexes':
return patterns.UnexpectedIndexes(e.indexes);
case 'Member':
return patterns.Member(e.index, e.errors);
case 'Lazy':
return patterns.Lazy(e.id, e.errors);
case 'Wrap':
return patterns.Wrap(e.error, e.errors);
}
};
return f;
};
/**
* @category Typeclass Constructor
* @since 0.9.4
*/
export function getSemigroup() {
return RA.getSemigroup();
}
/**
* @category Deconstructor
* @since 0.9.4
*/
export const drawError = flow(toTree, T.drawTree);
/**
* @category Deconstructor
* @since 0.9.4
*/
export const drawErrors = flow(RA.map(flow(toTree, T.drawTree)), (ss) => ss.join('\n'));
function toForest(errors) {
return errors.map(toTree);
}
function toTree(error) {
return pipe(error, match({
Leaf: (i, error) => T.of(`Expected ${error} but received ${JSON.stringify(i)}`),
Key: (key, errors) => ({ value: `Key ${key}`, forest: toForest(errors) }),
MissingKeys: (keys) => ({ value: `MissingKeys`, forest: pipe(keys, RA.map(T.of)) }),
UnexpectedKeys: (keys) => ({ value: `UnexpectedKeys`, forest: pipe(keys, RA.map(T.of)) }),
Index: (Index, errors) => ({ value: `Index ${Index}`, forest: toForest(errors) }),
MissingIndexes: (indexes) => ({
value: `Missing indexes`,
forest: pipe(indexes, RA.map(flow(String, T.of))),
}),
UnexpectedIndexes: (indexes) => ({
value: `Unexpected Indexes`,
forest: pipe(indexes, RA.map(flow(String, T.of))),
}),
Member: (index, errors) => ({
value: `${index}`,
forest: toForest(errors),
}),
Lazy: (id, errors) => ({
value: id,
forest: toForest(errors),
}),
Wrap: (error, errors) => ({
value: error,
forest: toForest(errors),
}),
}));
}
//# sourceMappingURL=DecodeError.js.map