package rpmfile-unix

  1. Overview
  2. Docs

Source file reader.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
module type S = sig
  val of_string : string -> (Rpmfile.metadata, string) result
  val of_channel : in_channel -> (Rpmfile.metadata, string) result
  val of_file : string -> (Rpmfile.metadata, string) result
end

(** Metadata Angstrom's parser.  *)
module P (S : Rpmfile.Selector.S) = struct
  open Rpmfile
  open Parsers

  let metadata_parser =
    let open Angstrom in
    let* lead = lead_parser in
    let* signature = header_parser ~selector:S.select_signature_tag in
    let* header = header_parser ~selector:S.select_header_tag in

    return { lead; signature; header }
end

module Make (Selector : Rpmfile.Selector.S) : S = struct
  let of_string =
    let module P = P (Selector) in
    Angstrom.(parse_string ~consume:Consume.Prefix) P.metadata_parser

  let of_channel ic =
    let module P = P (Selector) in
    In_channel.input_all ic
    |> Angstrom.(
         Angstrom.parse_string ~consume:Consume.Prefix P.metadata_parser)

  let of_file path = In_channel.with_open_bin path of_channel
end
OCaml

Innovation. Community. Security.