summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2026-08-25 14:06:21 -0500
committerJohn Estabrook <jestabro@vyos.io>2026-08-25 14:10:26 -0500
commiteeecee4bdafff78abe9cf7da0f5900a7cfe211fa (patch)
treede9c714e51d320512cf6052a7ffa2eccd09bc1f2 /src
parent51dcc060fb89aa8fbaf31d0f9431eb313efadd05 (diff)
downloadvyos1x-config-eeecee4bdafff78abe9cf7da0f5900a7cfe211fa.tar.gz
vyos1x-config-eeecee4bdafff78abe9cf7da0f5900a7cfe211fa.zip
T9231: add util subtree_values_of_path
Get tag/leaf values of subtree defined by a partial path, for example, a reference path.
Diffstat (limited to 'src')
-rw-r--r--src/derived.ml28
-rw-r--r--src/derived.mli6
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"]