From eeecee4bdafff78abe9cf7da0f5900a7cfe211fa Mon Sep 17 00:00:00 2001 From: John Estabrook Date: Tue, 25 Aug 2026 14:06:21 -0500 Subject: T9231: add util subtree_values_of_path Get tag/leaf values of subtree defined by a partial path, for example, a reference path. --- src/derived.ml | 28 ++++++++++++++++++++++++++++ src/derived.mli | 6 ++++++ 2 files changed, 34 insertions(+) diff --git a/src/derived.ml b/src/derived.ml index b980801..d1731f1 100644 --- a/src/derived.ml +++ b/src/derived.ml @@ -75,3 +75,31 @@ let subtree_from_partial ?(descent=true) reftree ctree result path = else acc in aux result [] path + + +let subtree_values_of_path rt ct path = + (* raises: + [Malformed_path] from subtree_from_partial + *) + let subtree = subtree_from_partial ~descent:false rt ct Config_tree.default path + in + if Util.is_empty path || subtree = Config_tree.default then + [([], [])] + else + let func (p, (acc, ct')) ft = + let path = List.rev p in + if Vytree.is_terminal_node ft then + let node = (Vytree.get[@alert "-exn"]) (ct': Config_tree.t) path in + let data = Vytree.data_of_node node in + let acc' = + if data.tag then ((Vytree.list_children node, path) :: acc) + else + if data.leaf then ((data.values, path) :: acc) + else acc + in (p, (acc', ct')) + else (p, (acc, ct')) + in fst (Vytree.fold_tree_with_path func ([], ([], ct)) subtree) + +let subtree_values_of_path_yojson rt ct path = + let ret = subtree_values_of_path rt ct path in + [%to_yojson: (string list * string list) list] ret |> Yojson.Safe.to_string diff --git a/src/derived.mli b/src/derived.mli index 61e4d8f..9ae2d26 100644 --- a/src/derived.mli +++ b/src/derived.mli @@ -2,3 +2,9 @@ exception Malformed_path of string val subtree_from_partial : ?descent:bool -> Reference_tree.t -> Config_tree.t -> Config_tree.t -> string list -> Config_tree.t [@@alert exn "Derived.Malformed_path"] + +val subtree_values_of_path : Reference_tree.t -> Config_tree.t -> string list -> (string list * string list) list +[@@alert exn "Derived.Malformed_path"] + +val subtree_values_of_path_yojson : Reference_tree.t -> Config_tree.t -> string list -> string +[@@alert exn "Derived.Malformed_path"] -- cgit v1.2.3