Crmgo Blog

AEL v Asterisk

AEL v Asterisk

v běžném formátu: ; A takto bude vypadat stejný kontext v syntaxi ael: Rozdíly jsou tedy zřejmé. Pro mě je jednou z hlavních výhod ael pohodlnost čtení konfiguračního souboru: i na tomto malém abstraktním příkladu je vidět, že číst a chápat…

AEL v Asterisk

v běžném formátu:
;

[internal]
exten => s,1,Answer
exten => s,n,Background(someivr)
exten => s,n,Read(intgroup,,3)
exten => s,n,Goto(${intgroup},1)
exten => XXX,1,Dial(SIP/${EXTEN})
exten => XXX,n,HangUp

Tento stejný kontext by v syntaxi ael vypadal takto:

context internal {
	s=> {
		Answer;
		Background(someivr);
		Read(intgroup,,3);
		Goto(${intgroup},1);
	}
	XXX => {
		Dial(SIP/${EXTEN});
		HangUp;
	}
}


Rozdíly jsou tedy zřejmé. Pro mě je jednou z hlavních výhod ael pohodlnost čtení konfiguračního souboru: i na tomto malém abstraktním příkladu je vidět, že konfigurační soubor je snazší číst a chápat. Připouštím však, že to je subjektivní. Druhou věcí, která okamžitě upoutá pozornost, je absence priorít (s,n ve výše uvedeném kódu; jak bylo poznamenáno v komentářích, priorita není nutná ani zde).
Proč nejsou? Nebo spíše, proč jsou přítomny v popisu běžného dialplanu?
Pokud jste dříve neměli co do činění s Asteriskem a jeho běžným dialplanem, budete překvapeni, když se dozvíte, že neobsahuje žádné cykly ani podmínky. Existuje pouze podmíněný přechod (gotoif), pomocí kterého lze teoreticky uspořádat i cykly, ale pohodlnost tohoto přístupu je velmi sporná. Představme si nejjednodušší kód ael, který bude vypisovat do konzole Asterisku true nebo false:

if(${var}=foo) {
	NoOp(true);
}
else {
	NoOp(false);
}

V běžné podobě by tato podmínka vypadala takto:

exten=>1,1,GotoIf($[${var}=foo]?label1:label2)
exten=>1,n(label1),NoOp(true)
exten=>1,n,Goto(end_of_if)
exten=>1,n(label2),NoOp(false)
exten=>1,n(end_of_if),...

Nevýhodou není jen ztráta „čitelnosti“, ale také nutnost buď všude staticky zapisovat priority (a získat zcela nerozšiřitelný kód), nebo vymýšlet štítky pro každou maličkost. Ano, v ael také existují štítky, ale potřeba v nich téměř mizí, protože syntaxe umožňuje vyhnout se goto jako takovému.

s=> {
	Answer;
	somelabel:
		HangUp;
}

Kromě přímých podmínek (if/else) můžete v ael používat také operátor switch s dobře známou syntaxí:

 _777X => {
         switch (${EXTEN}) {
              pattern N11:
                   NoOp(You called a N11 number-- ${EXTEN});
                   break;
              case 7771:
                   NoOp(You called 7771!);
                   break;
              case 7772:
                   NoOp(You called 7772!);
                   break;
              case 7773:
                   NoOp(You called 7773!);
                   // fall thru-
              default:
                   NoOp(In the default clause!);
         };

Poznámka: příspěvek mohl vzniknout s pomocí AI a lidskou redakcí. Odpovědný: Dmytro Lomaka, Kaltenkirchen.