[augeas-devel] Re: More generic constructions in util.aug
Raphaël Pinson
raphink at gmail.com
Fri Mar 27 22:04:52 UTC 2009
And here are some examples on group.aug and fstab.aug, adapting util.aug a
bit more still :
diff --git a/lenses/util.aug b/lenses/util.aug
index 0dced14..03ec6de 100644
--- a/lenses/util.aug
+++ b/lenses/util.aug
@@ -5,7 +5,7 @@ Module: Util
Author: David Lutterkort
About: License
- This file is licensed under the LGPLv2+, like the rest of Augeas.
+ This file is licensed under the GPL.
*)
@@ -97,6 +97,31 @@ Variable: stdexcl
(excl "*.augsave") .
(excl "*.augnew")
+
+(* Lists constructions *)
+ let list (lns:lens) (sep:lens) = lns . ( sep . lns ) *
+
+(* Stores *)
+ let sto_to_spc = store /([^ \t\n].*[^ \t\n]|[^ \t\n])/
+ let sto_no_spc = store /[^ ^\t\n]+/
+
+(* Labels *)
+ let xchg (m:regexp) (d:string) (l:string) = del m d . label l
+ let key_value_line (kw: regexp) (sep:lens) (sto:lens) =
+ [ key kw . sep . sto . eol ]
+ let key_value (kw: regexp) (sep:lens) (sto:lens) =
+ [ key kw . sep . sto ]
+
+ let brackets (l:lens) (r:lens) (lns:lens) = l . lns . r
+
+(* Regexps *)
+ let word = /[A-Za-z0-9_.-]+/
+ let integer = /[0-9]+/
+ let ip = /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/
+
+
+
+
(* Local Variables: *)
(* mode: caml *)
(* End: *)
diff --git a/lenses/fstab.aug b/lenses/fstab.aug
index 2246026..92f5250 100644
--- a/lenses/fstab.aug
+++ b/lenses/fstab.aug
@@ -5,21 +5,22 @@ module Fstab =
let sep_tab = Util.del_ws_tab
let sep_spc = Util.del_ws_spc
- let comma = Util.del_str ","
- let eol = del /[ \t]*\n/ "\n"
+ let sep_com = Util.del_str ","
+ let eol = Util.eol
let comment = Util.comment
let empty = Util.empty
let word = /[^,# \n\t]+/
let comma_sep_list (l:string) =
- [ label l . store word ] . ([comma . label l . store word])*
+ let lns = [ label l . store word ] in
+ Util.list lns sep_com
let record = [ seq "mntent" .
[ label "spec" . store word ] . sep_tab .
- [ label "file" . store word ] . sep_tab .
- comma_sep_list "vfstype" . sep_tab .
+ [ label "file" . store word ] . sep_tab .
+ comma_sep_list "vfstype" . sep_tab .
comma_sep_list "opt" .
- (sep_tab . [ label "dump" . store /[0-9]+/ ] .
+ ( sep_tab . [ label "dump" . store /[0-9]+/ ] .
( sep_spc . [ label "passno" . store /[0-9]+/ ])? )?
. eol ]
diff --git a/lenses/group.aug b/lenses/group.aug
index 26bfc61..0c5425b 100644
--- a/lenses/group.aug
+++ b/lenses/group.aug
@@ -17,25 +17,22 @@ let eol = Util.eol
let comment = Util.comment
let empty = Util.empty
-let colon = del ":" ":"
-let comma = del "," ","
+let sep_col = Util.del_str ":"
+let sep_com = Util.del_str ","
-let sto_to_eol = store /([^ \t\n].*[^ \t\n]|[^ \t\n])/
-
-let word = /[A-Za-z0-9_.-]+/
-let integer = /[0-9]+/
+let word = Util.word
+let integer = Util.integer
(************************************************************************
* ENTRIES
*************************************************************************)
-let user = [ label "user" . store word ]
-let entry = [ key word
- . colon
- . [ label "password" . store word . colon ]
- . [ label "gid" . store integer . colon ]
- . (user . (comma . user)*)?
- . eol ]
+let user = [ label "user" . store word ]
+let user_list = Util.list user sep_com
+let params = [ label "password" . store word . sep_col ]
+ . [ label "gid" . store integer . sep_col ]
+ . user_list?
+let entry = Util.key_value_line word sep_col params
(************************************************************************
* LENS
2009/3/27 Raphaël Pinson <raphink at gmail.com>
> Hi all,
>
> As shared with David on IRC, I think we should go even more towards sharing
> generic constructions in lenses to make writing lenses easier, and adopt
> generic ways of implementing common patterns.
>
> Here are some propositions already, taken from monit.aug and exports.aug
> and how these two lenses can be simplified by using the newly defined types
> :
>
>
> diff --git a/lenses/util.aug b/lenses/util.aug
> index 0dced14..40a9ec3 100644
> --- a/lenses/util.aug
> +++ b/lenses/util.aug
> @@ -97,6 +97,27 @@ Variable: stdexcl
> (excl "*.augsave") .
> (excl "*.augnew")
>
> +
> +(* Lists constructions *)
> + let list (lns:lens) (sep:lens) = lns . ( sep . lns ) *
> +
> +(* Stores *)
> + let sto_to_spc = store /([^ \t\n].*[^ \t\n]|[^ \t\n])/
> + let sto_no_spc = store /[^ ^\t\n]+/
> +
> +(* Labels *)
> + let xchg (m:regexp) (d:string) (l:string) = del m d . label l
> + let key_value_line (kw: regexp) (sep:lens) (sto:lens) =
> + [ key kw . sep . sto . eol ]
> + let key_value (kw: regexp) (sep:lens) (sto:lens) =
> + [ key kw . sep . sto ]
> +
> + let brackets (l:lens) (r:lens) (lns:lens) = l . lns . r
> +
> +(* Regexps *)
> + let word = /[A-Za-z0-9_.-]+/
> +
> +
> (* Local Variables: *)
> (* mode: caml *)
> (* End: *)
>
>
> diff --git a/lenses/exports.aug b/lenses/exports.aug
> index 499a3af..d3103e1 100644
> --- a/lenses/exports.aug
> +++ b/lenses/exports.aug
> @@ -78,19 +78,20 @@ module Exports =
>
> let client_re = /[a-zA-Z0-9\-\.@\*\?\/]+/
>
> - let eol = del /[ \t]*\n/ "\n"
> + let eol = Util.eol
> + let lbracket = Util.del_str "("
> + let rbracket = Util.del_str ")"
> + let sep_com = Util.del_str ","
> + let sep_spc = Util.del_ws_spc
>
> let option = [ label "option" . store /[^,)]+/ ]
>
> - let client = [ label "client" . store client_re .
> - ( Util.del_str "(" .
> - option .
> - ( Util.del_str "," . option ) * .
> - Util.del_str ")" )? ]
> + let client = [ label "client" . store client_re .
> + ( Util.brackets lbracket rbracket
> + ( Util.list option sep_com ) )? ]
>
> - let entry = [ label "dir" . store /\/[^ \t]*/ .
> - Util.del_ws_spc .
> - client . (Util.del_ws_spc . client)* . eol ]
> + let entry = [ label "dir" . store /\/[^ \t]*/
> + . sep_spc . Util.list client sep_spc . eol ]
>
> let lns = (Hosts.empty | Hosts.comment | entry)*
>
> diff --git a/lenses/monit.aug b/lenses/monit.aug
> index bd4e63e..24b69ae 100644
> --- a/lenses/monit.aug
> +++ b/lenses/monit.aug
> @@ -38,24 +38,24 @@ let spc = Util.del_ws_spc
> let comment = Util.comment
> let empty = Util.empty
>
> -let sto_to_eol = store /([^ \t\n].*[^ \t\n]|[^ \t\n])/
> -let sto_to_spc = store /[^ \t\n]+/
> +let sto_to_eol = Util.sto_to_spc
> +let sto_no_spc = Util.sto_no_spc
>
> -let word = /[A-Za-z0-9_.-]+/
> -let value = [ key word . spc . sto_to_eol . eol ]
> +let word = Util.word
> +let value = Util.key_value_line word spc sto_to_eol
>
> (************************************************************************
> * ENTRIES
>
> *************************************************************************)
>
> (* set statement *)
> -let set = [ key "set" . spc . value ]
> +let set = Util.key_value "set" spc value
>
> (* include statement *)
> -let include = [ key "include" . spc . sto_to_eol . eol ]
> +let include = Util.key_value_line "include" spc sto_to_eol
>
> (* service statement *)
> -let service = [ key "check" . spc . value . (spc . value)+ ]
> +let service = Util.key_value_line "check" spc (Util.list value spc)
>
> let entry = (set|include|service)
>
>
>
>
> Any ideas/comments are welcome :)
>
>
> Raphaël
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/augeas-devel/attachments/20090327/8e9ae49b/attachment.htm>
More information about the augeas-devel
mailing list