[asterisk-users] Exec two commands with ExecIf
asterisk at phreaknet.org
asterisk at phreaknet.org
Thu Dec 23 15:33:38 CST 2021
> -----Original Message-----
> From: asterisk-users <asterisk-users-bounces at lists.digium.com> On Behalf
> Of John Harragin
> Sent: Thursday, December 23, 2021 4:16 PM
> To: Asterisk Users Mailing List - Non-Commercial Discussion <asterisk-
> users at lists.digium.com>
> Subject: Re: [asterisk-users] Exec two commands with ExecIf
>
> gotoif accomplishes exactly what you want (except the one line part).
Not really - GotoIf does generic branching, not execution. The closest thing is just using ExecIf twice.
There are four general ways to do this in the dialplan that I can think of, each with their own pros and cons:
Option 1: ExecIf, fewest lines of dialplan, but lots of repetition
Same => n,ExecIf(${condition1}?App1(something))
Same => n,ExecIf(${condition1}?App2(somethingelse))
Same => n,ExecIf(${condition2}?App3(something))
Same => n,ExecIf(${condition2}?App4(somethingelse))
Option 2: If/EndIf, most "DRY" (don't repeat yourself), probably easiest to read/maintain
Same => n,If(${condition1})
Same => n,App1(something)
Same => n,App2(somethingelse)
Same => n,EndIf()
Same => n,If(${condition2})
Same => n,App3(something)
Same => n,App4(somethingelse)
Same => n,EndIf()
Option 3: using GotoIf, hardest to read, maintain, and update
Same => n,GotoIf(${condition1}?:postcond1)
Same => n,App1(something)
Same => n,App2(somethingelse)
Same => n(postcond1),GotoIf(${condition2}?: postcond2)
Same => n,App3(something)
Same => n,App4(somethingelse)
Same => n(postcond2),NoOp()
Option 4: using GosubIf, also easy to read, but worst performance penalty, requires additional extensions/contexts, plus might be silly for just a few lines
Same => n,GosubIf(${condition1}?condition1,1)
Same => n,GosubIf(${condition2}?condition2,1)
Exten => condition1,App1(something))
Same => n,App2(somethingelse)
Same => n,Return()
Exten => condition2,1,App3(something)
Same => n,App4(somethingelse)
Same => n,Return()
Using GotoIf is probably the ugliest way to do something like this. If, ExecIf, even Gosub are arguably more elegant.
Personally, I started off doing Option 3 (GotoIf) in my dialplan, moved to using Option 1 (ExecIf), and now I use Option 2 (If). I did this mainly because each progression made my dialplan easier to read and maintain. I don't use Gosub for code that would make sense to put in a function a regular procedural programming language (like C), and If/EndIf for stuff that would typically be done "inline", without a function call, particularly if only appears once in the whole dialplan. Often which paradigm is best depends on the context and goal.
>
>
> On Thu, Dec 23, 2021 at 3:32 PM Antony Stone
> <Antony.Stone at asterisk.open.source.it
> <mailto:Antony.Stone at asterisk.open.source.it> > wrote:
>
>
> On Thursday 23 December 2021 at 18:31:38, asterisk at phreaknet.org
> <mailto:asterisk at phreaknet.org> wrote:
>
> > > -----Original Message-----
> > > From: asterisk-users <asterisk-users-bounces at lists.digium.com
> <mailto:asterisk-users-bounces at lists.digium.com> > On Behalf
> > > Of Dovid Bender
> > > Sent: Thursday, December 23, 2021 12:11 PM
> > > To: Asterisk Users Mailing List - Non-Commercial Discussion
> <asterisk-
> > > users at lists.digium.com <mailto:users at lists.digium.com> >
> > > Subject: Re: [asterisk-users] Exec two commands with ExecIf
> > >
> > > Anyone know why this never made it into Asterisk?
> >
> > I believe it was deemed not to be of interest to the community.
>
> Assuming that the dates in that ticket refer to 2021 (I see only
> months and
> days, not years), I don't recall any discussion taking place with the
> community about it, so that seems to me like a surprising
> explanation.
>
> After all, if GotoIf(), ExecIf() and While() are "deemed to be of
> interest",
> and therefore exist, why would a simple If() be deemed not to be of
> interest?
>
> And, taking it from the other point of view, even if many people
> genuinely
> think "meh, I don't think I'd use this", then surely they just avoid
> using it,
> as I suspect the majority of people do with DumpChan() (for
> example, to take a
> pretty obscure, yet still available, command at random).
>
> In short, what's the drawback to making If() available for those who
> would use
> it?
>
> Personally, I would very much like to see an If() statement made
> available.
>
>
> Antony.
>
> --
> Tinned food was developed for the British Navy in 1813.
>
> The tin opener was not invented until 1858.
>
> Please reply to the list;
> please *don't* CC me.
>
> --
> ____________________________________________________
> _________________
> -- Bandwidth and Colocation Provided by http://www.api-digital.com
> --
>
> Check out the new Asterisk community forum at:
> https://community.asterisk.org/
>
> New to Asterisk? Start here:
> https://wiki.asterisk.org/wiki/display/AST/Getting+Started
>
> asterisk-users mailing list
> To UNSUBSCRIBE or update options visit:
> http://lists.digium.com/mailman/listinfo/asterisk-users
More information about the asterisk-users
mailing list