validating/validator.js

'use strict'

const DashValidator = require('./charCodeValidator/dashValidator')
const AtValidator = require('./charCodeValidator/atValidator')
const BlankSpaceValidator = require('./charCodeValidator/blankSpaceValidator')
const DotValidator = require('./charCodeValidator/dotValidator')
const ForwardSlashValidator = require('./charCodeValidator/forwardSlashValidator')
const LowerCaseValidator = require('./charCodeValidator/lowercaseLetterValidator')
const RoundBracketValidator = require('./charCodeValidator/roundBracketValidator')
const CurlyBracketValidator = require('./charCodeValidator/curlyBracketValidator')
const UpperCaseValidator = require('./charCodeValidator/uppercaseLetterValidator')
const DigitsValidator = require('./charCodeValidator/digitsValidator')

/** */
class CharacterValidator {

    constructor(validators) {
        this._validators = validators
    }

    static get Builder() {

        return Builder
    }

    /** 
     * Checks if a string contains a valid or invalid character at a given index. This check is very strict
     * and may be simplified in the future
     * @param {String} string the string that contains the character to be validated
     * @param {Number} index the index of the character
     * @returns {boolean} true if the character is a valid character, false if not
    */
    isValid(string, index) {
        return this._validators.some(validator => validator.isValid(string, index))
    }
}

/** 
 * @memberof Validator
 * @private 
 * */
class Builder {

    constructor() {
        this._validators = []
    }

    allowDash() {
        this._validators.push(new DashValidator())
        return this
    }

    /** */
    allowAt() {
        this._validators.push(new AtValidator())
        return this
    }

    /** */
    allowBlank() {
        this._validators.push(new BlankSpaceValidator())
        return this
    }

    /** */
    allowDot() {
        this._validators.push(new DotValidator())
        return this
    }

    /** */
    allowForwardSlash() {
        this._validators.push(new ForwardSlashValidator())
        return this
    }

    /** */
    allowRoundBrackets() {
        this._validators.push(new RoundBracketValidator())
        return this
    }

    /** */
    allowCurlyBrackets() {
        this._validators.push(new CurlyBracketValidator())
        return this
    }

    /** */
    allowUpperCaseLetters() {
        this._validators.push(new UpperCaseValidator())
        return this
    }

    /** */
    allowLowerCaseLetters() {
        this._validators.push(new LowerCaseValidator())
        return this
    }

    allowDigits() {
        this._validators.push(new DigitsValidator())
        return this
    }

    /** */
    build() {
        return new CharacterValidator(this._validators)
    }
}

module.exports = CharacterValidator