Crmgo Blog

AEL u asterisk

AEL u asterisk

u običnom formatu: ; Evo kako će isti kontekst izgledati u ael sintaksi: Dakle, razlike su očigledne. Za mene je jedna od glavnih prednosti ael pogodnost čitanja konfiguracije: čak i na ovom malom apstraktnom primeru se vidi da je čitanje i razumevanje…

AEL u asterisk

u običnom formatu:
;

[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

Evo kako će isti kontekst izgledati u ael sintaksi:

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


Dakle, razlike su očigledne. Za mene je jedna od glavnih prednosti ael pogodnost čitanja konfiguracije: čak i na ovom malom apstraktnom primeru vidi se da je čitanje i razumevanje konfiguracije jednostavnije. Iako priznajem da je to subjektivno. Druga stvar koja odmah upada u oči je odsustvo prioriteta (s,n u gornjem kodu, mada su, kako su primetili u komentarisima, prioriteti već postali neobavezni) u opisu dialplan-a.
Zašto ih nema? Tačnije, zašto postoje u opisu običnog dialplan-a?
Ako do sada niste imali posla sa Asterisk-om i njegovim običnim dialplan-om, bićete iznenađeni saznajući da u njemu nema ni petlji ni uslova. Postoji samo uslovni skok (gotoif), pomoću kojeg se, u principu, mogu organizovati čak i petlje, ali je pogodnost ovog pristupa veoma upitna. Zamislimo najjednostavniji ael kod koji će u konzolu Asterisk-a ispisivati true ili false:

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

U običnom obliku ovaj uslov bi izgledao ovako:

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),...

Ne samo da smo izgubili „čitljivost“, već smo prisiljeni da statički definišemo prioritete svuda (i dobijemo potpuno neekspanzibilan kod) ili da smišljamo oznake za svaku sitnicu. Da, u ael-u takođe postoje oznake, samo što je potreba za njima praktično nestala, jer sintaksa omogućava izbegavanje goto operacije kao takve.

s=> {
	Answer;
	somelabel:
		HangUp;
}

Pored direktnih uslova (if/else) u ael-u možete koristiti i switch operator sa uobičajenom sintaksom:

 _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!);
         };

Napomena: tekst može biti uz pomoć AI uz ljudsku proveru. Odgovoran: Dmytro Lomaka, Kaltenkirchen.