(* Lens for the mount provider

   Fork of the upstream Fstab lens. The main difference is that
   comma-separated options and vfstype are not parsed into individual
   entries, and are rather kept as one string
*)

module Mount_Fstab =
  let sep_tab = Sep.tab
  let sep_spc = Sep.space
  let comma   = Sep.comma
  let eol     = Util.eol

  let comment = Util.comment
  let empty   = Util.empty

  let file    = /[^# \t\n]+/

  (* An option label can't contain comma, comment, equals, or space *)
  let optlabel = /[^,#= \n\t]+/
  let spec    = /[^,# \n\t][^ \n\t]*/

  let comma_sep_list (l:string) =
    let value = [ label "value" . Util.del_str "=" . ( store Rx.neg1 )? ] in
      let lns = [ label l . store optlabel . value? ] in
         Build.opt_list lns comma

  let record = [ seq "mntent" .
                   [ label "spec" . store spec ] . sep_tab .
                   [ label "file" . store file ] . sep_tab .
                   [label "vfstype" . store file ] .
                   (sep_tab . [label "options" . store file ] .
                    (sep_tab . [ label "dump" . store /[0-9]+/ ] .
                     ( sep_spc . [ label "passno" . store /[0-9]+/ ])? )? )?
                 . Util.comment_or_eol ]

  let lns = ( empty | comment | record ) *
