Imported Upstream version 1.7.0
[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: tuple3
136      A tuple of 3 values *)
137 let tuple3 (one:lens) (two:lens) (three:lens) =
138   [ rspace lbrace
139   . label "tuple"
140   . [ label "value" . one ]
141   . lrspace comma
142   . [ label "value" . two ]
143   . lrspace comma
144   . [ label "value" . three ]
145   . lspace rbrace ]
146
147 (* View: list
148      A list of lenses *)
149 let list (kw:regexp) (lns:lens) =
150   [ rspace lbrace
151   . key kw
152   . lrspace comma
153   . opt_list lns
154   . lspace rbrace ]
155
156 (* View: value_list
157      A <list> of seq entries *)
158 let value_list (kw:regexp) (sto:lens) =
159   list kw (make_value sto)
160
161 (* View: application *)
162 let application (name:regexp) (parameter:lens) =
163   list name parameter
164
165 (* View: kernel_parameters
166      Config parameters accepted for kernel app *)
167 let kernel_parameters =
168     value "browser_cmd" path
169   | value "dist_auto_connect" (store /never|once/)
170   | value "error_logger" (store /tty|false|silent/)
171   | value "net_setuptime" integer
172   | value "net_ticktime" integer
173   | value "shutdown_timeout" integer
174   | value "sync_nodes_timeout" integer
175   | value "start_dist_ac" boolean
176   | value "start_boot_server" boolean
177   | value "start_disk_log" boolean
178   | value "start_pg2" boolean
179   | value "start_timer" boolean
180
181 (* View: kernel
182      Core Erlang kernel app configuration *)
183 let kernel = application "kernel" kernel_parameters
184
185 (* View: comment *)
186 let comment = Util.comment_generic /%[ \t]*/ "% "
187
188 (* View: config
189      A top-level config *)
190 let config (app:lens) =
191     (Util.empty | comment)*
192   . rspace lbrack
193   . Build.opt_list (kernel | app) (lrspace comma)
194   . lrspace rbrack
195   . Util.del_str "." . Util.eol
196   . (Util.empty | comment)*