import { BaseError, ErrorScope } from '../errors/base_error.cjs';
import { AnyValue } from './types/custom_type.types.cjs';

declare class ErrorResult extends BaseError {
    name: string;
    message: string;
    debug?: AnyValue | undefined;
    cause?: any;
    constructor(name?: string, message?: string, debug?: AnyValue | undefined, cause?: any);
    static factory: (input: {
        name?: string | undefined;
        message?: string | undefined;
        debug?: string | number | bigint | boolean | symbol | {
            [x: string]: any;
        } | {
            [x: string]: any;
        } | undefined;
        cause?: any;
        public_message?: string | undefined;
        stack?: string | undefined;
        error?: {
            [x: string]: any;
        } | {
            name?: string | undefined;
            debug?: string | number | bigint | boolean | symbol | {
                [x: string]: any;
            } | {
                [x: string]: any;
            } | undefined;
            message?: string | undefined;
            public_message?: string | undefined;
            stack?: string | undefined;
            error?: {
                [x: string]: any;
            } | any | {
                name?: string | undefined;
                message?: string | undefined;
                stack?: string | undefined;
                cause?: any | undefined;
            } | undefined;
            cause?: any;
            code?: number | undefined;
            method?: string | undefined;
            expose?: boolean | undefined;
            toObject?: {} | undefined;
            toString?: {} | undefined;
            makePublic?: {} | undefined;
            setScope?: {} | undefined;
            readonly getScope?: ErrorScope | undefined;
            rename?: {} | undefined;
        } | {
            name?: string | undefined;
            message?: string | undefined;
            stack?: string | undefined;
            cause?: any | undefined;
        } | undefined;
        code?: number | undefined;
        method?: string | undefined;
        expose?: boolean | undefined;
        toObject?: {} | undefined;
        toString?: {} | undefined;
        makePublic?: {} | undefined;
        setScope?: {} | undefined;
        readonly getScope?: ErrorScope | undefined;
        rename?: {} | undefined;
    }, options?: {
        defaultValue: boolean;
        excludeExtraProp: boolean;
    } | undefined, customMapperOverride?: ((input: {
        name?: string | undefined;
        message?: string | undefined;
        debug?: string | number | bigint | boolean | symbol | {
            [x: string]: any;
        } | {
            [x: string]: any;
        } | undefined;
        cause?: any;
        public_message?: string | undefined;
        stack?: string | undefined;
        error?: {
            [x: string]: any;
        } | {
            name?: string | undefined;
            debug?: string | number | bigint | boolean | symbol | {
                [x: string]: any;
            } | {
                [x: string]: any;
            } | undefined;
            message?: string | undefined;
            public_message?: string | undefined;
            stack?: string | undefined;
            error?: {
                [x: string]: any;
            } | any | {
                name?: string | undefined;
                message?: string | undefined;
                stack?: string | undefined;
                cause?: any | undefined;
            } | undefined;
            cause?: any;
            code?: number | undefined;
            method?: string | undefined;
            expose?: boolean | undefined;
            toObject?: {} | undefined;
            toString?: {} | undefined;
            makePublic?: {} | undefined;
            setScope?: {} | undefined;
            readonly getScope?: ErrorScope | undefined;
            rename?: {} | undefined;
        } | {
            name?: string | undefined;
            message?: string | undefined;
            stack?: string | undefined;
            cause?: any | undefined;
        } | undefined;
        code?: number | undefined;
        method?: string | undefined;
        expose?: boolean | undefined;
        toObject?: {} | undefined;
        toString?: {} | undefined;
        makePublic?: {} | undefined;
        setScope?: {} | undefined;
        readonly getScope?: ErrorScope | undefined;
        rename?: {} | undefined;
    }) => never) | undefined) => ErrorResult;
}
declare abstract class ResultBase {
    abstract unwrap(): any;
}
declare class ResultOk<T> extends ResultBase {
    readonly value: T;
    readonly isOk = true;
    readonly error: undefined;
    constructor(value: T);
    unwrap(): T;
}
declare class ResultError<E extends ErrorResult | undefined = ErrorResult> extends ResultBase {
    readonly error: E | undefined;
    readonly isOk = false;
    readonly value: undefined;
    constructor(error: E | undefined);
    unwrap(): never;
}
declare type Result<T, E extends ErrorResult | undefined = ErrorResult> = ResultOk<T> | ResultError<E>;
declare const Result_: {
    ok: <T>(value: T) => Result<T, never>;
    err: <I extends {
        name?: string | undefined;
        message?: string | undefined;
        debug?: string | number | bigint | boolean | symbol | {
            [x: string]: any;
        } | {
            [x: string]: any;
        } | undefined;
        cause?: any;
        public_message?: string | undefined;
        stack?: string | undefined;
        error?: {
            [x: string]: any;
        } | {
            name?: string | undefined;
            debug?: string | number | bigint | boolean | symbol | {
                [x: string]: any;
            } | {
                [x: string]: any;
            } | undefined;
            message?: string | undefined;
            public_message?: string | undefined;
            stack?: string | undefined;
            error?: {
                [x: string]: any;
            } | any | {
                name?: string | undefined;
                message?: string | undefined;
                stack?: string | undefined;
                cause?: any | undefined;
            } | undefined;
            cause?: any;
            code?: number | undefined;
            method?: string | undefined;
            expose?: boolean | undefined;
            toObject?: {} | undefined;
            toString?: {} | undefined;
            makePublic?: {} | undefined;
            setScope?: {} | undefined;
            readonly getScope?: ErrorScope | undefined;
            rename?: {} | undefined;
        } | {
            name?: string | undefined;
            message?: string | undefined;
            stack?: string | undefined;
            cause?: any | undefined;
        } | undefined;
        code?: number | undefined;
        method?: string | undefined;
        expose?: boolean | undefined;
        toObject?: {} | undefined;
        toString?: {} | undefined;
        makePublic?: {} | undefined;
        setScope?: {} | undefined;
        readonly getScope?: ErrorScope | undefined;
        rename?: {} | undefined;
    }, E extends ErrorResult = ErrorResult>(extendedError?: string | Error | I | undefined) => Result<never, E>;
};
declare type Guarded<Y, N = AnyValue> = {
    matches: true;
    value: Y;
} | {
    matches: false;
    value: N;
};
declare const typeGuarded: <Y, N = AnyValue>(v: Y | N, matches: boolean) => Guarded<Y, N>;
declare const typeValidateResult: <Y, I extends ErrorResult = ErrorResult>(v: AnyValue, matches: boolean, error?: string | I | undefined) => Result<Y, ErrorResult>;
declare type GetArgumentType<T> = T extends (...arguments_: infer U) => any ? U : never;

export { ErrorResult, GetArgumentType, Guarded, Result, ResultBase, ResultError, ResultOk, Result_, typeGuarded, typeValidateResult };
