import EditableField from "./EditableField";
import Event from "./Event";
import { MonacoEditor } from "./MonacoEditor";
import ValidationRuleSet from "./Validation";
import IValidationRule from "./IValidationRule";
import { editor } from "monaco-editor/esm/vs/editor/editor.api";
import ValidationResultGroup from "./ValidationResultGroup";
import ValidationResultSummary from "./ValidationSummary";
export default abstract class Excercise<RuleType extends IValidationRule, RuleSetType extends ValidationRuleSet<RuleType>> {
    protected _editableFields: EditableField[];
    protected abstract readonly _ruleSets: RuleSetType[];
    protected readonly _monacoEditorInstance: MonacoEditor;
    protected readonly id: string;
    constructor(monacoEditorElement: HTMLElement, content?: string, monacoConfig?: editor.IStandaloneEditorConstructionOptions);
    abstract addValidationRule(): RuleSetType;
    protected abstract validateRule(rule: RuleType): Promise<boolean> | boolean;
    readonly onValidate: Event<ValidationResultSummary>;
    get content(): string;
    get monacoEditorInstance(): editor.IStandaloneCodeEditor;
    setEditableFields(fields: EditableField[]): void;
    clearEditableFields(): void;
    validate(): Promise<ValidationResultSummary>;
    /**
     * Override this method to add custom validation
     */
    protected abstract validateExtend(): Promise<Array<ValidationResultGroup>>;
    private editableFieldsChanged;
}
