The XML syntax used by Fusebox since the 4.0 version allows for conditional expressions like these:
In the latter case, the
This only makes sense if you don't have a
Fusebox 5.5, however, made the
As part of migrating an app from 5.0 to 5.5.1, I really didn't want to have to go back and add all those extra tags, nor deal with the extra verbosity when maintaining the application down the road. So I wrote a small patch for the core files that will allow an implicit
Index: fuseboxVerb.cfc =================================================================== --- fuseboxVerb.cfc (revision 778) +++ fuseboxVerb.cfc (working copy) @@ -33,20 +33,26 @@+ - - - - - - - + +- - + + + + + + + + + ++ + Index: verbs/if.cfm =================================================================== --- verbs/if.cfm (revision 778) +++ verbs/if.cfm (working copy) @@ -35,13 +35,9 @@ // at most one , at most one , nothing else: fb_.hasTrue = false; fb_.hasFalse = false; + fb_.verbInfo.hasOther = false; for (fb_.i = 1; fb_.i lte fb_.verbInfo.nChildren; fb_.i = fb_.i + 1) { - if (fb_.verbInfo.children[fb_.i].getNamespace() is not "") { - fb_throw("fusebox.badGrammar.illegalVerb", - "Illegal verb", - "An 'if' may contain only 'true' and 'false' verbs in fuseaction #fb_.verbInfo.circuit#.#fb_.verbInfo.fuseaction#."); - } - switch (fb_.verbInfo.children[fb_.i].getVerb()) { + switch (fb_.verbInfo.children[fb_.i].getNamespace() & fb_.verbInfo.children[fb_.i].getVerb()) { case "true": if (fb_.hasTrue) { fb_throw("fusebox.badGrammar.illegalVerb", @@ -61,10 +57,41 @@ } break; default: + fb_.verbInfo.hasOther = true; + break; + } + } + if (fb_.verbInfo.hasOther) { + if (fb_.hasTrue OR fb_.hasFalse OR fb_.verbInfo.action.getCircuit().getApplication().strictMode) { fb_throw("fusebox.badGrammar.illegalVerb", "Illegal verb", "An 'if' may contain only 'true' and 'false' verbs in fuseaction #fb_.verbInfo.circuit#.#fb_.verbInfo.fuseaction#."); - break; + } else { + // only non-true/false and not strict mode, so wrap an implicit true around the children + // we have to do some acrobatics around the 'children' references + fb_.children = structNew(); + for (fb_.i = 1; fb_.i lte fb_.verbInfo.nChildren; fb_.i = fb_.i + 1) { + fb_.children[fb_.i] = fb_.verbInfo.children[fb_.i]; + } + structClear(fb_.verbInfo.children); + fb_.factory = fb_.verbInfo.action.getCircuit().getApplication().getFuseactionFactory(); + fb_.implicitTrue = fb_.factory.create( + "true", + fb_.verbInfo.action, + structNew(), + fb_.children + ); + fb_.verbInfo.children[1] = fb_.implicitTrue; + // now null out the remaining children + for (fb_.i = 2; fb_.i lte fb_.verbInfo.nChildren; fb_.i = fb_.i + 1) { + fb_.verbInfo.children[fb_.i] = fb_.factory.create( + "noop", + fb_.verbInfo.action, + structNew(), + arrayNew(1) + ); + } + fb_.hasTrue = true; } } Index: verbs/noop.cfm =================================================================== --- verbs/noop.cfm (revision 0) +++ verbs/noop.cfm (revision 0) @@ -0,0 +1 @@ + ') />
The implementation is kind of hacky because the XML compiler lacks a IR transformation step, so I had to fake one. And that was further complicated by the parallelism in the internal datastructures, necessitating the creation of a "noop" verb to use as a placeholder in certain situation. 5 minimum deposit casino More specifically, there isn't a way to add or remove verbs from the parse tree, only to change verbs, and implementing the functionality within that constraint required some "creative" programming. ;)
Comments are closed.