Configuration file in Erlang
Quando scrivete un progetto in erlang, grande o piccolo che sia, vi troverete davanti alla necessità di spostare con il codice hard-coded in un foglio di configurazione, che l’utente avrà la possibilità di modificare a piacere.
In erlang tutto ciò è molto semplice, tanto da poter essere implementato in poche righe di codice.
Iniziamo creando un file di configurazione che metteremo nella directory di Unix /etc/software/software.cfg
Possiamo creare tale file usando il comando vim dalla shell di Unix, oppure un qualsiasi editor di testo (nota bene che la cartella /etc/ è di solito di proprietà dell’utente root, quindi o eseguite tali comandi come tale utente, o cambiate directory con una vostra directory locale.
pegaso:~ bellerofonte$ sudo mkdir /etc/software pegaso:~ bellerofonte$ sudo vim /etc/software/software.conf
E qui editate il file aggiungendo i parametri che vi pare (i miei rappresentano il mio blog), seguendo però la seguente forma:
{nome, "Paolo D'Incau's Blog"}. {url, "https://pdincau.wordpress.com/"}. {framework, "WordPress"}.
Ogni campo viene identificato con una tupla a due campi: il primo è un atom che identifica la tupla (tag), mentre il secondo è il valore associato a tale tag e può essere un qualsiasi tipo erlang (lista, tupla, atom etc etc).
E’ importante che mettiate il punto alla fine di ogni riga e che controlliate che ogni tupla sia corretta nella sintassi.
Ora come carichiamo tali tali nel nostro codice erlang?
Ecco la risposta:
>1 {ok, Conf} = file:consult("/etc/software/software.cfg"). {ok,[{nome,"Paolo D'Incau's Blog"}, {url,"https://pdincau.wordpress.com/"}, {framework,"WordPress"}]}
Come vedete il risultato della funzione consult/1 del modulo file è una tupla. Nel caso tutto sia giusto, tale tupla sarà composta dall’atom ok e dalla lista dei valori nel file di configurazione.
Io metto {ok, Conf} confidente nel fatto che facciate tutto giusto, ma se cosi non fosse otterreste questo errore:
>1 {ok, Conf} = file:consult("/etc/software/software.cfg"). ** exception error: no match of right hand side value {error,enoent}
Ok, ora come recuperiamo tra questi valori un singolo valore che ci interessa?
Ecco una possibile soluzione:
4> lists:keysearch(nome, 1, Conf). {value,{nome,"Paolo D'Incau's Blog"}}
In questo caso ho utilizzato la funzione keysearch/3 del modulo lists. Essa prende in ingresso, una tag, un intero (che rappresenta quale posizione della tupla deve avere tale tag) e una lista di tuple.
Recent Posts
- An interview with Michał Ślaski about TDD and testing in Erlang
- An interview with Alvaro Videla (@old_sound ) about RabbitMQ and Erlang
- Talking about Erlang, Riak and Vector Clocks with Christopher Meiklejohn (@cmeik)
- Talking about Erlang with Fernando Benavides
- Talking about Elixir and the Erlang VM with José Valim