Source file reader.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
module type S = sig
  val of_flow :
    ?initial_size:int ->
    max_size:int ->
    _ Eio.Flow.source ->
    (Rpmfile.metadata, string) Stdlib.result
end

module Make (S : Rpmfile.Selector.S) : S = struct
  let of_flow ?(initial_size = 3_000) ~max_size flow =
    let buf = Eio.Buf_read.of_flow flow ~initial_size ~max_size in
    let parser =
      Parsers.metadata_parser ~select_signature_tag:S.select_signature_tag
        ~select_header_tag:S.select_header_tag
    in

    Eio.Buf_read.format_errors parser buf
    |> Result.map_error (function `Msg m -> m)
end