Pull to refresh

Comments 3

Очень интересно, но слишком кратко. Вы бы объяснили как реализован этот DSL, пример входного файла и как на нём работает этот DSL
DSL реализован с помощью AST трансформаций на этапе компиляции. Все выражения конвертируются и заменяются на соответствующие вызовы методов библиотеки. После этого на выходе получаем обычный Groovy скрипт. К примеру, файл из статьи HelloGrules.groovy будет выглядеть следующим образом:

public class test.HelloGrules extends groovy.lang.Script {

    public test.HelloGrules() {
    }

    public test.HelloGrules(groovy.lang.Binding context) {
        super.setBinding(context)
    }

    public static void main(java.lang.String[] args) {
        org.codehaus.groovy.runtime.InvokerHelper.runScript(test.HelloGrules, args)
    }

    public java.lang.Object run() {
        this.applyRuleToRequiredParameter('email', {
            org.grules.script.expressions.SubrulesSeqWrapper.wrap(new org.grules.script.expressions.FunctionTerm({
                this.isEmail(it)
            }, 'isEmail') [ 'Invalid email'])
        })
        this.applyRuleToRequiredParameter('age', {
            org.grules.script.expressions.SubrulesSeqWrapper.wrap(new org.grules.script.expressions.FunctionTerm({
                this.toPositiveInt(it)
            }, 'toPositiveInt') [ 'Invalid age']) >> {
                it  > 18
            } [ 'You must be and adult']
        })
    }
}

Затем, на этапе выполнения, скармливаем скрипту набор входящих параметров и, анализируя результат каждого метода, собираем все воедино в виде отчета.

Добавил HelloWorld пример для наглядности. Также есть небольшое видео с туториалом по использованию библиотеки в проекте под управлением Grails (English).
Sign up to leave a comment.

Articles