diff --git a/example/load.ml b/example/load.ml index c15b466..5d5b69b 100644 --- a/example/load.ml +++ b/example/load.ml @@ -9,8 +9,10 @@ let filter v = let () = Eio_main.run @@ fun env -> - Eio_mem.run @@ fun _ -> - let cwd = Eio.Stdenv.cwd env |> Eio_mem.Fs.load ~filter in + Eio_mem.run @@ fun mem_env -> + let cwd = Eio.Stdenv.cwd env in + Eio_mem.Fs.load ~filter cwd; + let cwd = Eio.Stdenv.cwd mem_env in Eio.traceln "The following filesystem has been loaded into memory: %a..." Eio.Path.pp cwd; - Eio_mem.Fs.tree ~depth:max_int Fmt.stdout cwd + Eio_mem.Fs.tree ~depth:3 Fmt.stdout cwd diff --git a/src/eio_mem.ml b/src/eio_mem.ml index fb029d2..de6506f 100644 --- a/src/eio_mem.ml +++ b/src/eio_mem.ml @@ -152,35 +152,36 @@ module Fs = struct | _ -> Eio.traceln "Skipping %a" Eio.Path.pp v in make_fs path; - ((fs, start) :> Eio.Fs.dir_ty Eio.Path.t) + () let tree ~depth = let name path = Filename.basename (Eio.Path.native_exn path) in - let rec pp_nodes prefix ppf = function + let rec pp_nodes ~depth prefix ppf = function | [] -> () - | [ last ] -> pp_node prefix true ppf last + | [ last ] -> pp_node ~depth prefix true ppf last | current :: rest -> - pp_node prefix false ppf current; - pp_nodes prefix ppf rest - and pp_node prefix is_last ppf v = - (* Eio.traceln "pp_node %a" Eio.Path.pp v; *) - match Eio.Path.kind ~follow:false v with - | `Regular_file -> - let marker = if is_last then "└── " else "├── " in - Fmt.pf ppf "%s%s%s@." prefix marker (name v) - | `Directory -> - let marker = if is_last then "└── " else "├── " in - Fmt.pf ppf "%s%s%s@." prefix marker (name v); - let next_prefix = prefix ^ if is_last then " " else "│ " in - let children = Eio.Path.read_dir v |> List.map Eio.Path.(( / ) v) in - pp_nodes next_prefix ppf children - | `Symbolic_link -> - let marker = if is_last then "└── " else "├── " in - Fmt.pf ppf "%s%s%s -> %s@." prefix marker (name v) - (Eio.Path.read_link v) - | _ -> () + pp_node ~depth prefix false ppf current; + pp_nodes ~depth prefix ppf rest + and pp_node ~depth prefix is_last ppf v = + if depth <= 0 then () + else + match Eio.Path.kind ~follow:false v with + | `Regular_file -> + let marker = if is_last then "└── " else "├── " in + Fmt.pf ppf "%s%s%s@." prefix marker (name v) + | `Directory -> + let marker = if is_last then "└── " else "├── " in + Fmt.pf ppf "%s%s%s@." prefix marker (name v); + let next_prefix = prefix ^ if is_last then " " else "│ " in + let children = Eio.Path.read_dir v |> List.map Eio.Path.(( / ) v) in + pp_nodes ~depth:(depth - 1) next_prefix ppf children + | `Symbolic_link -> + let marker = if is_last then "└── " else "├── " in + Fmt.pf ppf "%s%s%s -> %s@." prefix marker (name v) + (Eio.Path.read_link v) + | _ -> () in - fun ppf v -> pp_node "" true ppf v + fun ppf v -> pp_node ~depth "" true ppf v end type stdenv = < fs : Eio.Fs.dir_ty Eio.Path.t ; cwd : Eio.Fs.dir_ty Eio.Path.t > diff --git a/src/eio_mem.mli b/src/eio_mem.mli index 885e916..162ba3f 100644 --- a/src/eio_mem.mli +++ b/src/eio_mem.mli @@ -11,10 +11,7 @@ module Fs : sig val make : ?config:Config.t -> unit -> [ `Close | Eio.Fs.dir_ty ] Eio.Path.t (** Construct a fresh file-system using an optional configuration. *) - val load : - ?filter:(Eio.Fs.dir_ty Eio.Path.t -> bool) -> - Eio.Fs.dir_ty Eio.Path.t -> - Eio.Fs.dir_ty Eio.Path.t + val load : ?filter:('a Eio.Path.t -> bool) -> 'a Eio.Path.t -> unit (** [load path] will reset the in-memory filesystem and fill it with the directory tree at [path].