index.js 2.06 KB
Newer Older
xuchaozou's avatar
xuchaozou committed
1
import AwakenDirective from "./AwakenDirective"
2
import HomePageDirective from "./HomePageDirective"
xuchaozou's avatar
xuchaozou committed
3
import CloseMenuDirective from "./CloseMenuDirective/index"
邹绪超's avatar
邹绪超 committed
4
import ByeDirective from "./ByeDirective"
xuchaozou's avatar
xuchaozou committed
5
import OpenMenuDirective from "./OpenMenuDirective/index"
xuchaozou's avatar
xuchaozou committed
6
import TestDirective from "./TestDirective"
xuchaozou's avatar
xuchaozou committed
7

xuchaozou's avatar
xuchaozou committed
8 9
const DirectiveTypes = (process.env.NODE_ENV == "development" ? [TestDirective] : []).concat([
    // AwakenDirective,
10
    HomePageDirective,
11 12
    OpenMenuDirective,
    CloseMenuDirective
xuchaozou's avatar
xuchaozou committed
13
])
xuchaozou's avatar
xuchaozou committed
14 15
const AllDirectiveTypes = DirectiveTypes.concat(ByeDirective)

xuchaozou's avatar
xuchaozou committed
16 17 18
class Directive {
    constructor (options = {}) {
        this.directiveTypes = options.directiveTypes || DirectiveTypes
xuchaozou's avatar
xuchaozou committed
19
        this._directiveTypes = this.parseDirectiveTypes();
xuchaozou's avatar
xuchaozou committed
20 21 22 23
        this.params = options.params || {}
        this.directives = []
    }

xuchaozou's avatar
xuchaozou committed
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
    parseDirectiveTypes () {
        const directiveTypes = [] 
        this.directiveTypes.map(directiveType => {
            this.circlePushDirective(directiveType , directiveTypes)
        })
        return directiveTypes
    }

    circlePushDirective(directiveType, directiveTypes) {
        if(directiveType.beforeLoadDirectives  && directiveType.beforeLoadDirectives.length > 0 ) {
            directiveType.beforeLoadDirectives.map(i => this.circlePushDirective(i, directiveTypes))
        } 
        directiveTypes.push(directiveType)
    }

xuchaozou's avatar
xuchaozou committed
39 40
    parse ({text}) {
        let isHasSuccess = false
xuchaozou's avatar
xuchaozou committed
41 42
        for(let i = 0 ; i < this._directiveTypes.length ; i++) {
            const directive = new this._directiveTypes[i]({text , directives : this.directives, params : this.params})
xuchaozou's avatar
xuchaozou committed
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
            if(directive.match()) {
                isHasSuccess = true
                this.directives.push(directive)
                break
            }
        }
        return isHasSuccess ? this.directives.at(-1) : null
    }

    async excute (directive = this.directives.at(-1)) {
        if(!directive) return 
        const data = await directive.excute()
        return data
    }

    destroy () {

    }
}

邹绪超's avatar
邹绪超 committed
63 64 65 66 67
export default Directive
export {
    DirectiveTypes,
    AllDirectiveTypes
}