import { OpenApi } from "../OpenApi";
import { IOpenApiSchemaError } from "../structures/IOpenApiSchemaError";
import { IResult } from "../structures/IResult";
/**
 * Type checker of OpenAPI type schema.
 *
 * `OpenApiTypeChecker` is a type checker of {@link OpenApi.IJsonSchema}.
 *
 * @author Jeongho Nam - https://github.com/samchon
 */
export declare namespace OpenApiTypeChecker {
    /**
     * Test whether the schema is a nul type.
     *
     * @param schema Target schema
     * @returns Whether null type or not
     */
    const isNull: (schema: OpenApi.IJsonSchema) => schema is OpenApi.IJsonSchema.INull;
    /**
     * Test whether the schema is an unknown type.
     *
     * @param schema Target schema
     * @returns Whether unknown type or not
     */
    const isUnknown: (schema: OpenApi.IJsonSchema) => schema is OpenApi.IJsonSchema.IUnknown;
    /**
     * Test whether the schema is a constant type.
     *
     * @param schema Target schema
     * @returns Whether constant type or not
     */
    const isConstant: (schema: OpenApi.IJsonSchema) => schema is OpenApi.IJsonSchema.IConstant;
    /**
     * Test whether the schema is a boolean type.
     *
     * @param schema Target schema
     * @returns Whether boolean type or not
     */
    const isBoolean: (schema: OpenApi.IJsonSchema) => schema is OpenApi.IJsonSchema.IBoolean;
    /**
     * Test whether the schema is an integer type.
     *
     * @param schema Target schema
     * @returns Whether integer type or not
     */
    const isInteger: (schema: OpenApi.IJsonSchema) => schema is OpenApi.IJsonSchema.IInteger;
    /**
     * Test whether the schema is a number type.
     *
     * @param schema Target schema
     * @returns Whether number type or not
     */
    const isNumber: (schema: OpenApi.IJsonSchema) => schema is OpenApi.IJsonSchema.INumber;
    /**
     * Test whether the schema is a string type.
     *
     * @param schema Target schema
     * @returns Whether string type or not
     */
    const isString: (schema: OpenApi.IJsonSchema) => schema is OpenApi.IJsonSchema.IString;
    /**
     * Test whether the schema is an array type.
     *
     * @param schema Target schema
     * @returns Whether array type or not
     */
    const isArray: (schema: OpenApi.IJsonSchema) => schema is OpenApi.IJsonSchema.IArray;
    /**
     * Test whether the schema is a tuple type.
     *
     * @param schema Target schema
     * @returns Whether tuple type or not
     */
    const isTuple: (schema: OpenApi.IJsonSchema) => schema is OpenApi.IJsonSchema.ITuple;
    /**
     * Test whether the schema is an object type.
     *
     * @param schema Target schema
     * @returns Whether object type or not
     */
    const isObject: (schema: OpenApi.IJsonSchema) => schema is OpenApi.IJsonSchema.IObject;
    /**
     * Test whether the schema is a reference type.
     *
     * @param schema Target schema
     * @returns Whether reference type or not
     */
    const isReference: (schema: OpenApi.IJsonSchema) => schema is OpenApi.IJsonSchema.IReference;
    /**
     * Test whether the schema is an union type.
     *
     * @param schema Target schema
     * @returns Whether union type or not
     */
    const isOneOf: (schema: OpenApi.IJsonSchema) => schema is OpenApi.IJsonSchema.IOneOf;
    /**
     * Test whether the schema is recursive reference type.
     *
     * Test whether the target schema is a reference type, and test one thing more
     * that the reference is self-recursive or not.
     *
     * @param props Properties for recursive reference test
     * @returns Whether the schema is recursive reference type or not
     */
    const isRecursiveReference: (props: {
        components: OpenApi.IComponents;
        schema: OpenApi.IJsonSchema;
    }) => boolean;
    /**
     * Escape from the {@link OpenApi.IJsonSchema.IReference} type.
     *
     * Escape from the {@link OpenApi.IJsonSchema.IReference} type, replacing the
     * every references to the actual schemas. If the escape is successful, the returned
     * schema never contains any {@link OpenApi.IJsonSchema.IReference} type in its
     * structure.
     *
     * If the schema has a recursive reference, the recursive reference would be repeated
     * as much as the `props.recursive` depth. If you've configured the `props.recursive`
     * as `false` or `0`, it would be failed and return an {@link IOpenApiSchemaError}.
     * Also, if there's a {@link OpenApi.IJsonSchema.IReference} type which cannot find
     * the matched type in the {@link OpenApi.IComponents.schemas}, it would also be failed
     * and return an {@link IOpenApiSchemaError} either.
     *
     * @param props Properties for escaping
     * @returns Escaped schema, or error with reason
     */
    const escape: (props: {
        components: OpenApi.IComponents;
        schema: OpenApi.IJsonSchema;
        recursive: false | number;
        accessor?: string;
        refAccessor?: string;
    }) => IResult<OpenApi.IJsonSchema, IOpenApiSchemaError>;
    /**
     * Unreference the schema.
     *
     * Unreference the schema, replacing the {@link OpenApi.IJsonSchema.IReference} type
     * to the actual schema. Different with {@link escape} is, the `unreference` function
     * does not resolve every references in the schema, but resolve only one time.
     *
     * If there's a {@link OpenApi.IJsonSchema.IReference} type which cannot find
     * the matched type in the {@link OpenApi.IComponents.schemas}, and you've called this
     * `unreference()` function with the reference, it would also be failed and return an
     * {@link IOpenApiSchemaError} value.
     *
     * @param props Properties of unreference
     * @returns Unreferenced schema
     */
    const unreference: (props: {
        components: OpenApi.IComponents;
        schema: OpenApi.IJsonSchema;
        accessor?: string;
        refAccessor?: string;
    }) => IResult<OpenApi.IJsonSchema, IOpenApiSchemaError>;
    /**
     * Visit every nested schemas.
     *
     * Visit every nested schemas of the target, and apply the `props.closure` function.
     *
     * Here is the list of occurring nested visitings:
     *
     * - {@link OpenApi.IJsonSchema.IOneOf.oneOf}
     * - {@link OpenApi.IJsonSchema.IReference}
     * - {@link OpenApi.IJsonSchema.IObject.properties}
     * - {@link OpenApi.IJsonSchema.IObject.additionalProperties}
     * - {@link OpenApi.IJsonSchema.IArray.items}
     * - {@link OpenApi.IJsonSchema.ITuple.prefixItems}
     * - {@link OpenApi.IJsonSchema.ITuple.additionalItems}
     *
     * @param props Properties for visiting
     */
    const visit: (props: {
        closure: (schema: OpenApi.IJsonSchema, accessor: string) => void;
        components: OpenApi.IComponents;
        schema: OpenApi.IJsonSchema;
        accessor?: string;
        refAccessor?: string;
    }) => void;
    /**
     * Test whether the `x` schema covers the `y` schema.
     *
     * @param props Properties for testing
     * @returns Whether the `x` schema covers the `y` schema
     */
    const covers: (props: {
        components: OpenApi.IComponents;
        x: OpenApi.IJsonSchema;
        y: OpenApi.IJsonSchema;
    }) => boolean;
}
