Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
input_channel.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 34
open Lwt.Infix module Bytebuffer = Cohttp_lwt.Private.Bytebuffer module Make (Channel : Mirage_channel.S) = struct exception Read_exn of Channel.error type t = { chan : Channel.t; buf : Bytebuffer.t } let refill chan buf ~pos ~len = Channel.read_some ~len chan >>= function | Ok (`Data v) -> let len = Cstruct.length v in Cstruct.blit_to_bytes v 0 buf pos len; Lwt.return (`Ok len) | Ok `Eof -> Lwt.return `Eof | Error e -> raise (Read_exn e) let create ?(buf_len = 0x4000) chan = { buf = Bytebuffer.create buf_len; chan } let read_line_opt t = Bytebuffer.read_line t.buf (refill t.chan) let read t count = Bytebuffer.read t.buf (refill t.chan) count let refill t = Bytebuffer.refill t.buf (refill t.chan) let with_input_buffer t ~f = let buf = Bytebuffer.unsafe_buf t.buf in let pos = Bytebuffer.pos t.buf in let len = Bytebuffer.length t.buf in let res, consumed = f (Bytes.unsafe_to_string buf) ~pos ~len in Bytebuffer.drop t.buf consumed; res let close t = Channel.close t.chan end