AEL Switch & Case

Home » Asterisk Users » AEL Switch & Case
Asterisk Users 2 Comments

Hi.

I think I’ve discovered a bug in either the implementation of the documentation of the AEL switch command.

https://wiki.asterisk.org/wiki/display/AST/AEL+Conditionals gives an example of using switch, and states at the bottom:

“Neither the switch nor case values are wrapped in $[ ]; they can be constants, or ${var} type references only.”

However, I’ve run into a problem, which can be demonstrated by the simple context:

context SwitchTest {
s => {
Set(FortyTwo=42);
Set(SixByNine=54);
switch(${SixByNine}) {
case 123:
NoOp(123);
break;
case ${FortyTwo}:
NoOp(${FortyTwo});
break;
}
}
}

This gets converted by AEL into:

[ Context ‘SwitchTest’ created by ‘pbx_ael’ ]
‘s’ => 1. MSet(~~EXTEN~~=${EXTEN})
2. Set(FortyTwo=42)
3. Set(SixByNine=54)
4. Goto(sw_5410_${SixByNine},10)
5. NoOp(Finish switch_SwitchTest_5410)
‘sw_5410_’ => 10. Goto(sw_5410_.,10)
11. Goto(s,5)
‘sw_5410_123’ => 10. NoOp(123)
11. Goto(s,5)
‘_sw_5410_.’ => 10. Goto(s,5)

So, there was no implementation of the “case ${FortyTwo}” match.

Am I misundertanding “they can be constants, or ${var} type references only.”?

Antony.


Normal people think “If it ain’t broke, don’t fix it”. Engineers think “If it ain’t broke, it doesn’t have enough features yet”.

Please reply to the list;
please *don’t* CC me.

2 thoughts on - AEL Switch & Case

  • I don’t think this is a bug. ${FortyTwo} is not defined when the AEL
    dialplan is transpiled into dialplan. It only gets set at runtime. This might work if you made FortyTwo a global variable, which would be available when this gets parsed.

    NA

  • Replying to list this time…

    Agreed, however that is surely a perfectly reasonable “${var} type reference”?

    Quite possibly, but I would expect switch() to work in the same way as multiple if() statements:

    switch(${a}) {
    case ${b}: NoOp(${b} matches); break;
    case ${c}: NoOp(${c} matches); break;
    // etc….
    }

    should be equivalent to:

    if(${a}=${b}) NoOp(${b} matches);
    if(${a}=${c}) NoOp(${c} matches);
    // etc….

    The latter works perfectly well, no matter when ${b} and ${c} are assigned their values.

    I’ve adjusted my dialplan to use multiple if()s, but I still thik that either the implementation or the documentation of switch is incorrect.

    Antony.


    I bought a book on memory techniques, but I’ve forgotten where I put it.

    Please reply to the list;
    please *don’t* CC me.