export type ConvertErrorCode = | 'malformed-directive' | 'malformed-pipe-table' | 'not-an-adf-document' | 'unknown-directive-name' | 'unmappable-html' | 'unmappable-image' | 'unspellable-adjacent-lists' | 'unspellable-character' | 'unspellable-line-start' | 'unspellable-link-destination' | 'unspellable-link-title' | 'unspellable-whitespace' | 'unsupported-document-version' | 'unsupported-nesting-depth' | 'unsupported-node-shape' export type ConvertErrorPath = readonly (number | string)[] export type SourcePosition = { line: number; offset: number } export type ConvertFault = { code: ConvertErrorCode message: string } export type ConvertError = ConvertFault & { path: ConvertErrorPath; position?: SourcePosition } export type ParseError = ConvertError & { position: SourcePosition } export type Result = { error: E; ok: false } | { ok: true; value: T } export function failure(code: ConvertErrorCode, message: string, path: ConvertErrorPath): Result { return { error: { code, message, path }, ok: false } } export function faulted(fault: ConvertFault, path: ConvertErrorPath): Result { return failure(fault.code, fault.message, path) } export function positioned(result: Result, position: SourcePosition): Result { if (result.ok) return result return { error: { ...result.error, position: result.error.position ?? position }, ok: false } } export function success(value: T): { ok: true; value: T } { return { ok: true, value } }