diff options
| -rw-r--r-- | src/derived.ml | 28 | ||||
| -rw-r--r-- | src/derived.mli | 6 |
2 files changed, 34 insertions, 0 deletions
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"] |
