Build

Generic functions to build lenses

Author: Raphael Pinson rap.nosp@m.hink@gmai.nosp@m.l.com

Summary
BuildGeneric functions to build lenses
LicenseThis file is licensed under the LGPL v2+, like the rest of Augeas.
ReferenceThis file provides generic functions to build Augeas lenses
GENERIC CONSTRUCTIONS
bracketsPut a lens inside brackets
LIST CONSTRUCTIONS
listBuild a list of identical lenses separated with a given separator (at least 2 elements)
opt_listSame as list, but there might be only one element in the list
LABEL OPERATIONS
xchgReplace a pattern with a different label in the tree, thus emulating a key but allowing to replace the keyword with a different value than matched
xchgsSame as xchg, but the pattern is the default string
SUBNODE CONSTRUCTIONS
key_value_lineA subnode with a keyword, a separator and a storing lens, and an end of line
key_value_line_commentSame as key_value_line, but allows to have a comment in the end of a line and an end of line
key_valueSame as key_value_line, but does not end with an end of line
key_ws_valueStore a key/value pair where key and value are separated by whitespace and the value goes to the end of the line.
flagA simple flag subnode, consisting of a single key
flag_lineA simple flag line, consisting of a single key
BLOCK CONSTRUCTIONS
block_genericA block enclosed in brackets
block_setdefaultA block enclosed in brackets
block_ldelim_re
block_rdelim_re
block_ldelim_default
block_rdelim_default
blockA block enclosed in brackets
block_ldelim_newlines_re
block_rdelim_newlines_re
block_ldelim_newlines_default
block_rdelim_newlines_default
block_newlineA block enclosed in brackets, with newlines forced and indentation defaulting to a tab.
block_newlines_spcA block enclosed in brackets, with newlines forced and indentation defaulting to a tab.
named_blockA named block enclosed in brackets
COMBINATORICS
combine_two_ordCombine two lenses, ensuring first lens is first
combine_twoCombine two lenses
combine_two_opt_ordCombine two lenses optionally, ensuring first lens is first (a, and optionally b)
combine_two_optCombine two lenses optionally (either a, b, or both, in any order)
combine_three_ordCombine three lenses, ensuring first lens is first (a followed by either b, c, in any order)
combine_threeCombine three lenses
combine_three_opt_ordCombine three lenses optionally, ensuring first lens is first (a followed by either b, c, or any of them, in any order)
combine_three_optCombine three lenses optionally (either a, b, c, or any of them, in any order)

License

This file is licensed under the LGPL v2+, like the rest of Augeas.

Reference

This file provides generic functions to build Augeas lenses

GENERIC CONSTRUCTIONS

brackets

let brackets (l:lens) (r:lens) (lns:lens) = l . lns . r

Put a lens inside brackets

Parameters

l:lensthe left bracket lens
r: lensthe right bracket lens
lns:lensthe lens to put inside brackets

LIST CONSTRUCTIONS

list

let list (lns:lens) (sep:lens) = lns . ( sep . lns )+

Build a list of identical lenses separated with a given separator (at least 2 elements)

Parameters

lns:lensthe lens to repeat in the list
sep:lensthe separator lens, which can be taken from the Sep module

opt_list

let opt_list (lns:lens) (sep:lens) = lns . ( sep . lns )*

Same as list, but there might be only one element in the list

Parameters

lns:lensthe lens to repeat in the list
sep:lensthe separator lens, which can be taken from the Sep module

LABEL OPERATIONS

xchg

let xchg (m:regexp) (d:string) (l:string) = del m d . label l

Replace a pattern with a different label in the tree, thus emulating a key but allowing to replace the keyword with a different value than matched

Parameters

m:regexpthe pattern to match
d:stringthe default value when a node in created
l:stringthe label to apply for such nodes

xchgs

let xchgs (m:string) (l:string) = xchg m m l

Same as xchg, but the pattern is the default string

Parameters

m:stringthe string to replace, also used as default
l:stringthe label to apply for such nodes

SUBNODE CONSTRUCTIONS

key_value_line

let key_value_line (kw:regexp) (sep:lens) (sto:lens) = [ key kw . sep . sto . eol ]

A subnode with a keyword, a separator and a storing lens, and an end of line

Parameters

kw:regexpthe pattern to match as key
sep:lensthe separator lens, which can be taken from the Sep module
sto:lensthe storing lens

key_value_line_comment

let key_value_line_comment (kw:regexp) (sep:lens) (sto:lens) (comment:lens) = [ key kw . sep . sto . (eol|comment) ]

Same as key_value_line, but allows to have a comment in the end of a line and an end of line

Parameters

kw:regexpthe pattern to match as key
sep:lensthe separator lens, which can be taken from the Sep module
sto:lensthe storing lens
comment:lensthe comment lens, which can be taken from Util

key_value

let key_value (kw: regexp) (sep:lens) (sto:lens) = [ key kw . sep . sto ]

Same as key_value_line, but does not end with an end of line

Parameters

kw:regexpthe pattern to match as key
sep:lensthe separator lens, which can be taken from the Sep module
sto:lensthe storing lens

key_ws_value

let key_ws_value (kw:regexp) = key_value_line kw Util.del_ws_spc (store Rx.space_in)

Store a key/value pair where key and value are separated by whitespace and the value goes to the end of the line.  Leading and trailing whitespace is stripped from the value.  The end of line is consumed by this lens

Parameters

kw:regexpthe pattern to match as key

flag

let flag (kw:regexp) = [ key kw ]

A simple flag subnode, consisting of a single key

Parameters

kw:regexpthe pattern to match as key

flag_line

let flag_line (kw:regexp) = [ key kw . eol ]

A simple flag line, consisting of a single key

Parameters

kw:regexpthe pattern to match as key

BLOCK CONSTRUCTIONS

block_generic

let block_generic (entry:lens) (entry_noindent:lens) (entry_noeol:lens) (entry_noindent_noeol:lens) (comment:lens) (comment_noindent:lens) (ldelim_re:regexp) (rdelim_re:regexp) (ldelim_default:string) (rdelim_default:string) = let block_single = entry_noindent_noeol | comment_noindent in let block_start = entry_noindent | comment_noindent in let block_middle = (entry | comment)* in let block_end = entry_noeol | comment in del ldelim_re ldelim_default . ( ( block_start . block_middle . block_end ) | block_single ) . del rdelim_re rdelim_default

A block enclosed in brackets

Parameters

entry:lensthe entry to be stored inside the block.  This entry should include Util.empty or its equivalent if necessary.
entry_noindent:lensthe entry to be stored inside the block, without indentation.  This entry should not include Util.empty
entry_noeol:lensthe entry to be stored inside the block, without eol.  This entry should not include Util.empty
entry_noindent_noeol:lensthe entry to be stored inside the block, without indentation or eol.  This entry should not include Util.empty
comment:lensthe comment lens used in the block
comment_noindent:lensthe comment lens used in the block, without indentation.
ldelim_re:regexpregexp for the left delimiter
rdelim_re:regexpregexp for the right delimiter
ldelim_default:stringdefault value for the left delimiter
rdelim_default:stringdefault value for the right delimiter

block_setdefault

A block enclosed in brackets

Parameters

entry:lensthe entry to be stored inside the block.  This entry should not include Util.empty, Util.comment or Util.comment_noindent, should not be indented or finish with an eol.
ldelim_re:regexpregexp for the left delimiter
rdelim_re:regexpregexp for the left delimiter
ldelim_default:stringdefault value for the left delimiter
rdelim_default:stringdefault value for the right delimiter

block_ldelim_re

block_rdelim_re

let block_rdelim_re = /[ \t\n]*\}/

block_ldelim_default

block_rdelim_default

let block_rdelim_default = "}"

block

let block (entry:lens) = block_setdelim entry block_ldelim_re block_rdelim_re block_ldelim_default block_rdelim_default

A block enclosed in brackets

Parameters

entry:lensthe entry to be stored inside the block.  This entry should not include Util.empty, Util.comment or Util.comment_noindent, should not be indented or finish with an eol.

block_ldelim_newlines_re

block_rdelim_newlines_re

let block_rdelim_newlines_re = /[ \t]*\}/

block_ldelim_newlines_default

block_rdelim_newlines_default

let block_rdelim_newlines_default = "}"

block_newline

let block_newlines (entry:lens) (comment:lens) = del block_ldelim_newlines_re block_ldelim_newlines_default . ((entry | comment) . (Util.empty | entry | comment)*)? . del block_rdelim_newlines_re block_rdelim_newlines_default

A block enclosed in brackets, with newlines forced and indentation defaulting to a tab.

Parameters

entry:lensthe entry to be stored inside the block.  This entry should not include Util.empty, Util.comment or Util.comment_noindent, should be indented and finish with an eol.

block_newlines_spc

let block_newlines_spc (entry:lens) (comment:lens) = del (/[ \t\n]/ . block_ldelim_newlines_re) block_ldelim_newlines_default . ((entry | comment) . (Util.empty | entry | comment)*)? . del block_rdelim_newlines_re block_rdelim_newlines_default

A block enclosed in brackets, with newlines forced and indentation defaulting to a tab.  The opening brace must be preceded by whitespace

Parameters

entry:lensthe entry to be stored inside the block.  This entry should not include Util.empty, Util.comment or Util.comment_noindent, should be indented and finish with an eol.

named_block

let named_block (kw:regexp) (entry:lens) = [ key kw . block entry . eol ]

A named block enclosed in brackets

Parameters

kw:regexpthe regexp for the block name
entry:lensthe entry to be stored inside the block this entry should not include Util.empty

COMBINATORICS

combine_two_ord

let combine_two_ord (a:lens) (b:lens) = a . b

Combine two lenses, ensuring first lens is first

Parameters

a:lensthe first lens
b:lensthe second lens

combine_two

let combine_two (a:lens) (b:lens) = combine_two_ord a b | combine_two_ord b a

Combine two lenses

Parameters

a:lensthe first lens
b:lensthe second lens

combine_two_opt_ord

let combine_two_opt_ord (a:lens) (b:lens) = a . b?

Combine two lenses optionally, ensuring first lens is first (a, and optionally b)

Parameters

a:lensthe first lens
b:lensthe second lens

combine_two_opt

let combine_two_opt (a:lens) (b:lens) = combine_two_opt_ord a b | combine_two_opt_ord b a

Combine two lenses optionally (either a, b, or both, in any order)

Parameters

a:lensthe first lens
b:lensthe second lens

combine_three_ord

let combine_three_ord (a:lens) (b:lens) (c:lens) = combine_two_ord a (combine_two b c)

Combine three lenses, ensuring first lens is first (a followed by either b, c, in any order)

Parameters

a:lensthe first lens
b:lensthe second lens
c:lensthe third lens

combine_three

let combine_three (a:lens) (b:lens) (c:lens) = combine_three_ord a b c | combine_three_ord b a c | combine_three_ord c b a

Combine three lenses

Parameters

a:lensthe first lens
b:lensthe second lens
c:lensthe third lens

combine_three_opt_ord

let combine_three_opt_ord (a:lens) (b:lens) (c:lens) = combine_two_opt_ord a (combine_two_opt b c)

Combine three lenses optionally, ensuring first lens is first (a followed by either b, c, or any of them, in any order)

Parameters

a:lensthe first lens
b:lensthe second lens
c:lensthe third lens

combine_three_opt

let combine_three_opt (a:lens) (b:lens) (c:lens) = combine_three_opt_ord a b c | combine_three_opt_ord b a c | combine_three_opt_ord c b a

Combine three lenses optionally (either a, b, c, or any of them, in any order)

Parameters

a:lensthe first lens
b:lensthe second lens
c:lensthe third lens
let brackets (l:lens) (r:lens) (lns:lens) = l . lns . r
Put a lens inside brackets
let list (lns:lens) (sep:lens) = lns . ( sep . lns )+
Build a list of identical lenses separated with a given separator (at least 2 elements)
let opt_list (lns:lens) (sep:lens) = lns . ( sep . lns )*
Same as list, but there might be only one element in the list
let xchg (m:regexp) (d:string) (l:string) = del m d . label l
Replace a pattern with a different label in the tree, thus emulating a key but allowing to replace the keyword with a different value than matched
let xchgs (m:string) (l:string) = xchg m m l
Same as xchg, but the pattern is the default string
let key_value_line (kw:regexp) (sep:lens) (sto:lens) = [ key kw . sep . sto . eol ]
A subnode with a keyword, a separator and a storing lens, and an end of line
let key_value_line_comment (kw:regexp) (sep:lens) (sto:lens) (comment:lens) = [ key kw . sep . sto . (eol|comment) ]
Same as key_value_line, but allows to have a comment in the end of a line and an end of line
let key_value (kw: regexp) (sep:lens) (sto:lens) = [ key kw . sep . sto ]
Same as key_value_line, but does not end with an end of line
let key_ws_value (kw:regexp) = key_value_line kw Util.del_ws_spc (store Rx.space_in)
Store a key/value pair where key and value are separated by whitespace and the value goes to the end of the line.
let flag (kw:regexp) = [ key kw ]
A simple flag subnode, consisting of a single key
let flag_line (kw:regexp) = [ key kw . eol ]
A simple flag line, consisting of a single key
let block_generic (entry:lens) (entry_noindent:lens) (entry_noeol:lens) (entry_noindent_noeol:lens) (comment:lens) (comment_noindent:lens) (ldelim_re:regexp) (rdelim_re:regexp) (ldelim_default:string) (rdelim_default:string) = let block_single = entry_noindent_noeol | comment_noindent in let block_start = entry_noindent | comment_noindent in let block_middle = (entry | comment)* in let block_end = entry_noeol | comment in del ldelim_re ldelim_default . ( ( block_start . block_middle . block_end ) | block_single ) . del rdelim_re rdelim_default
A block enclosed in brackets
let block_rdelim_re = /[ \t\n]*\}/
let block_rdelim_default = "}"
let block (entry:lens) = block_setdelim entry block_ldelim_re block_rdelim_re block_ldelim_default block_rdelim_default
A block enclosed in brackets
let block_rdelim_newlines_re = /[ \t]*\}/
let block_rdelim_newlines_default = "}"
let block_newlines (entry:lens) (comment:lens) = del block_ldelim_newlines_re block_ldelim_newlines_default . ((entry | comment) . (Util.empty | entry | comment)*)? . del block_rdelim_newlines_re block_rdelim_newlines_default
A block enclosed in brackets, with newlines forced and indentation defaulting to a tab.
let block_newlines_spc (entry:lens) (comment:lens) = del (/[ \t\n]/ . block_ldelim_newlines_re) block_ldelim_newlines_default . ((entry | comment) . (Util.empty | entry | comment)*)? . del block_rdelim_newlines_re block_rdelim_newlines_default
A block enclosed in brackets, with newlines forced and indentation defaulting to a tab.
let named_block (kw:regexp) (entry:lens) = [ key kw . block entry . eol ]
A named block enclosed in brackets
let combine_two_ord (a:lens) (b:lens) = a . b
Combine two lenses, ensuring first lens is first
let combine_two (a:lens) (b:lens) = combine_two_ord a b | combine_two_ord b a
Combine two lenses
let combine_two_opt_ord (a:lens) (b:lens) = a . b?
Combine two lenses optionally, ensuring first lens is first (a, and optionally b)
let combine_two_opt (a:lens) (b:lens) = combine_two_opt_ord a b | combine_two_opt_ord b a
Combine two lenses optionally (either a, b, or both, in any order)
let combine_three_ord (a:lens) (b:lens) (c:lens) = combine_two_ord a (combine_two b c)
Combine three lenses, ensuring first lens is first (a followed by either b, c, in any order)
let combine_three (a:lens) (b:lens) (c:lens) = combine_three_ord a b c | combine_three_ord b a c | combine_three_ord c b a
Combine three lenses
let combine_three_opt_ord (a:lens) (b:lens) (c:lens) = combine_two_opt_ord a (combine_two_opt b c)
Combine three lenses optionally, ensuring first lens is first (a followed by either b, c, or any of them, in any order)
let combine_three_opt (a:lens) (b:lens) (c:lens) = combine_three_opt_ord a b c | combine_three_opt_ord b a c | combine_three_opt_ord c b a
Combine three lenses optionally (either a, b, c, or any of them, in any order)
Generic separators to build lenses
Generic module providing useful primitives
let empty = empty_generic empty_generic_re
Map empty lines, including empty comments
let comment = comment_generic /[ \t]*#[ \t]*/ "# "
Map comments into “#comment” nodes
let comment_noindent = comment_generic /#[ \t]*/ "# "
Map comments into “#comment” nodes, without indentation
Close