import type { MaybePromise, Event, Disposable, URI } from '@difizen/mana-common';
import type { Contribution } from '@difizen/mana-syringe';
import { Syringe } from '@difizen/mana-syringe';
export interface OpenerOptions {
}
export declare const OpenHandler: Syringe.DefinedToken;
/**
 * `OpenHandler` should be implemented to provide a new opener.
 */
export interface OpenHandler {
    /**
     * A unique id of this handler.
     */
    readonly id: string;
    /**
     * A human-readable name of this handler.
     */
    readonly label?: string;
    /**
     * A css icon class of this handler.
     */
    readonly iconClass?: string;
    /**
     * Test whether this handler can open the given resource for given options.
     * Return a nonzero number if this handler can open; otherwise it cannot.
     * Never reject.
     *
     * A returned value indicating a priority of this handler.
     */
    canHandle: (resource: URI, options?: OpenerOptions) => MaybePromise<number>;
    /**
     * Open a widget for the given resource and options.
     * Resolve to an opened widget or undefined, e.g. if a page is opened.
     * Never reject if `canHandle` return a positive number; otherwise should reject.
     */
    open: (resource: URI, options?: OpenerOptions) => MaybePromise<Record<any, any> | undefined>;
}
export declare const OpenerService: unique symbol;
/**
 * `OpenerService` provide an access to existing openers.
 */
export interface OpenerService {
    /**
     * Return all registered openers.
     * Never reject.
     */
    getOpeners: (() => Promise<OpenHandler[]>) & ((resource: URI, options?: OpenerOptions) => Promise<OpenHandler[]>);
    /**
     * Return an opener with the higher priority for the given resource.
     * Reject if such does not exist.
     */
    getOpener: (resource: URI, options?: OpenerOptions) => Promise<OpenHandler>;
    /**
     * Add open handler i.e. for custom editors
     */
    addHandler?: (openHandler: OpenHandler) => Disposable;
    /**
     * Event that fires when a new opener is added or removed.
     */
    onDidChangeOpeners?: Event<void>;
}
export declare function open(openerService: OpenerService, resource: URI, options?: OpenerOptions): Promise<Record<string, any> | undefined>;
export declare class DefaultOpenerService implements OpenerService {
    protected readonly handlersProvider: Contribution.Provider<OpenHandler>;
    constructor(handlersProvider: Contribution.Provider<OpenHandler>);
    getOpener(resource: URI, options?: OpenerOptions): Promise<OpenHandler>;
    getOpeners(resource?: URI, options?: OpenerOptions): Promise<OpenHandler[]>;
    protected prioritize(resource: URI, options?: OpenerOptions): Promise<OpenHandler[]>;
    protected getHandlers(): OpenHandler[];
}
//# sourceMappingURL=open-handler.d.ts.map