diff options
| author | John Estabrook <jestabro@vyos.io> | 2026-08-25 14:06:21 -0500 |
|---|---|---|
| committer | John Estabrook <jestabro@vyos.io> | 2026-08-25 14:10:26 -0500 |
| commit | eeecee4bdafff78abe9cf7da0f5900a7cfe211fa (patch) | |
| tree | de9c714e51d320512cf6052a7ffa2eccd09bc1f2 | |
| parent | 51dcc060fb89aa8fbaf31d0f9431eb313efadd05 (diff) | |
| download | vyos1x-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.
| -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"] |
