Üzleti szabályok szövegként a NEWMACRO()-val
A NEWMACRO(text, [nocompile], [isasync]) egy kis nyelv néhány sorát function(model, helpers) függvénnyé alakítja. Olyan szabályokhoz való, amelyek gyakrabban változnak, mint a kód: kedvezmény, ár, jogosultság-ellenőrzés, olyan validáció, amelyet valaki, aki nem ír JavaScriptet, fájlban vagy adatbázisban tart karban.
A nyelv, ahogyan ellenőriztük:
- Az
IF condition,ELSE IF condition,ELSEésFI(a feltétel vége) úgy működik, mint egy szövegalapú szabályban. A feltételek a>,<,>=,<=,=ésAND/ORoperátorokat használják. - A
RETURN valueegy értékkel fejezi be a makrót. AYESés aNO(valamint aTRUE,FALSE,OK) logikai értékek, az idézőjelek közötti szöveg szöveg, a számok pedig számok. - Egy szó a modell egy tulajdonsága, kisbetűvel írva: az
ageamodel.age-et olvassa, atotal = price * qtypedig amodel.total-t írja. - A
NAME(arguments)egy helpert hív meg, az átadotthelpersobjektum ilyen nevű (kisbetűs) függvényét; benne athisa modell. Ha azisasyncértéketrue, a makró aszinkron függvény, és megvárja a helpereket. - A
#namea futás ideiglenes változója:#temp = num + 1ésRETURN #temp. - Használjon több betűs neveket: az egybetűs tulajdonságot vagy változót az ellenőrzések során nem ismerte fel.
A NEWMACRO() a szöveget a new Function-nel fordítja le, így a makró kód: csak olyan szöveget fordítson le, amelyet Ön írt vagy amelyet megbízható személy tart karban, soha nem látogató által küldöttet. Ha a nocompile értéke true, a függvény helyett az általa generált JavaScriptet adja vissza, ami hasznos annak megtekintéséhez, mit csinál egy szabály.
const helpers = {
percent: function(value, rate) {
return value * rate / 100;
}
};
const age = NEWMACRO("IF age >= 18\n\tRETURN 'adult'\nELSE\n\tRETURN 'minor'\nFI");
const level = NEWMACRO("IF points > 100\n\tRETURN 'gold'\nELSE IF points > 50\n\tRETURN 'silver'\nELSE\n\tRETURN 'bronze'\nFI");
const access = NEWMACRO("IF active AND score >= 5\n\tRETURN yes\nFI\nRETURN no");
const total = NEWMACRO("total = price * qty\nIF qty >= 10\n\ttotal = total - PERCENT(total, 10)\nFI\nRETURN total");
const temporary = NEWMACRO("#next = count + 1\nRETURN #next");
const slow = NEWMACRO("RETURN LOOKUP(code)", false, true);
exports.install = function() {
ROUTE('POST /rules/', rules);
ROUTE('GET /source/', source);
};
async function rules($) {
const model = $.body;
$.json({
age: age(model, helpers),
level: level(model, helpers),
access: access(model, helpers),
total: total(model, helpers),
model_total: model.total,
temporary: temporary(model, helpers),
slow: await slow(model, { lookup: async code => 'found ' + code })
});
}
function source($) {
$.plain(NEWMACRO("IF points > 100\n\tRETURN 'gold'\nFI", true));
}