2d73d2540480e1cc693d885c3f71f3bd5d972f38
[platform/upstream/augeas.git] / lenses / erlang.aug
1 (*
2 Module: Erlang
3   Parses Erlang configuration files
4
5 Author: Raphael Pinson <raphael.pinson@camptocamp.com>
6
7 About: Reference
8   This lens tries to keep as close as possible to `http://www.erlang.org/doc/man/config.html` where possible.
9
10 About: License
11    This file is licenced under the LGPL v2+, like the rest of Augeas.
12
13 About: Lens Usage
14    To be documented
15
16 About: Configuration files
17    This lens applies to Erlang configuration files. See <filter>.
18
19 About: Examples
20    The <Test_Erlang> file contains various examples and tests.
21 *)
22 module Erlang =
23
24
25 (* Group: Spacing Functions *)
26
27 (* View: space *)
28 let space = del /[ \t\n]*/ ""
29
30 (* View: lspace
31      Add spaces to the left of char *)
32 let lspace (char:string) = del (/[ \t\n]*/ . char) char
33
34 (* View: rspace
35      Add spaces to the right of char *)
36 let rspace (char:string) = del (char . /[ \t\n]*/ ) char
37
38 (* View: lrspace
39      Add spaces to the left or right of char *)
40 let lrspace (char:string) = del (/[ \t\n]*/ . char . /[ \t\n]*/ ) char
41
42
43 (* Group: Separators *)
44
45 (* Variable: lbrace
46      Left square bracket *)
47 let lbrace = "{"
48
49 (* Variable: rbrace
50      Right square bracket *)
51 let rbrace = "}"
52
53 (* Variable: lbrack
54      Left curly brackets *)
55 let lbrack = "["
56
57 (* Variable: rbrack
58      Right curly brackets *)
59 let rbrack = "]"
60
61 (* Variable: lglob
62      Left glob separator *)
63 let lglob = "<<\""
64
65 (* Variable: rglob
66      Right glob separator *)
67 let rglob = "\">>"
68
69 (* Variable: comma *)
70 let comma = ","
71
72
73 (* Group: Value types *)
74
75 (* View: opt_list
76      An optional list of elements, in square brackets *)
77 let opt_list (lns:lens) = rspace lbrack
78                         . (Build.opt_list lns (lrspace comma) . space)?
79                         . Util.del_str rbrack
80
81 (* View: integer
82      Store a <Rx.integer> *)
83 let integer = store Rx.integer
84
85 (* View: decimal
86      Store a decimal value *)
87 let decimal = store /[0-9]+(.[0-9]+)?/
88
89 (* View: quoted
90      Store a quoted value *)
91 let quoted = Quote.do_quote (store /[^,\n}{]+/)
92
93 (* View: bare
94      Store a bare <Rx.word> *)
95 let bare = store Rx.word
96
97 (* View: boolean
98      Store a boolean value *)
99 let boolean = store /true|false/
100
101 (* View: path
102      Store a path (<quoted>) *)
103 let path = quoted
104
105 (* View: glob
106      Store a glob *)
107 let glob = Util.del_str lglob . store /[^\n"]+/ . Util.del_str rglob
108
109 (* View: make_value
110      Make a "value" subnode for arrays/tuples *)
111 let make_value (lns:lens) = [ label "value" . lns ]
112
113
114 (* Group: Store types *)
115
116 (* View: value
117      A single value *)
118 let value (kw:regexp) (sto:lens) =
119   [ rspace lbrace
120   . key kw
121   . lrspace comma
122   . sto
123   . lspace rbrace ]
124
125 (* View: tuple
126      A tuple of values *)
127 let tuple (one:lens) (two:lens) =
128   [ rspace lbrace
129   . label "tuple"
130   . [ label "value" . one ]
131   . lrspace comma
132   . [ label "value" . two ]
133   . lspace rbrace ]
134
135 (* View: list
136      A list of lenses *)
137 let list (kw:regexp) (lns:lens) =
138   [ rspace lbrace
139   . key kw
140   . lrspace comma
141   . opt_list lns
142   . lspace rbrace ]
143
144 (* View: value_list
145      A <list> of seq entries *)
146 let value_list (kw:regexp) (sto:lens) =
147   list kw (make_value sto)
148
149 (* View: application *)
150 let application (name:regexp) (parameter:lens) =
151   list name parameter
152
153 (* View: kernel_parameters
154      Config parameters accepted for kernel app *)
155 let kernel_parameters =
156     value "browser_cmd" path
157   | value "dist_auto_connect" (store /never|once/)
158   | value "error_logger" (store /tty|false|silent/)
159   | value "net_setuptime" integer
160   | value "net_ticktime" integer
161   | value "shutdown_timeout" integer
162   | value "sync_nodes_timeout" integer
163   | value "start_dist_ac" boolean
164   | value "start_boot_server" boolean
165   | value "start_disk_log" boolean
166   | value "start_pg2" boolean
167   | value "start_timer" boolean
168
169 (* View: kernel
170      Core Erlang kernel app configuration *)
171 let kernel = application "kernel" kernel_parameters
172
173 (* View: comment *)
174 let comment = Util.comment_generic /%[ \t]*/ "% "
175
176 (* View: config
177      A top-level config *)
178 let config (app:lens) =
179     (Util.empty | comment)*
180   . rspace lbrack
181   . Build.opt_list (kernel | app) (lrspace comma)
182   . lrspace rbrack
183   . Util.del_str "." . Util.eol
184   . (Util.empty | comment)*