mediv0/vue-input-validator

View on GitHub
src/validatorBus.ts

Summary

Maintainability
A
25 mins
Test Coverage
import { eventSubscribersItemList, eventType, IeventSubscribers, IsubscribersObjectType } from "./types";

const Bus = class ValidatorBus {
    static instance: ValidatorBus;
    private subscribers: IeventSubscribers = {};

    constructor() {
        if (ValidatorBus.instance) {
            return ValidatorBus.instance;
        }

        ValidatorBus.instance = this;
    }

    public request(name: eventType, requestkey?: string): any {
        const _sub = this.subscribers[name];

        if (_sub) {
            const _cb = _sub.find(o => o.key === requestkey);
            if (name === "validationStatus" || name === "validate") {
                return this.handleValidationStatus(_cb, requestkey);
            } else {
                this.handleSetErrors(_cb, _sub);
            }
        } else {
            // convert to throw error
            throw new Error(`event ${name} does not have any caller,`);
        }
    }

    public sub(event: eventType, cb: Function, key = ""): void {
        if (!this.subscribers[event]) {
            this.subscribers[event] = []; // init empty list
        }
        this.subscribers[event].push({
            key: key,
            handler: cb
        });
    }

    private handleValidationStatus(_cb: IsubscribersObjectType | undefined, requestkey?: string): boolean | never {
        if (_cb) {
            return _cb.handler();
        } else {
            throw new Error(`the key ${requestkey} does not exist.`);
        }
    }
    private handleSetErrors(_cb: IsubscribersObjectType | undefined, _subs: eventSubscribersItemList): void {
        if (_cb) {
            _cb.handler();
        } else {
            _subs.forEach(sub => {
                sub.handler();
            });
        }
    }
};

export default Bus;