summaryrefslogtreecommitdiff
path: root/src/util_reference_tree.ml
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2026-09-02 07:15:59 -0500
committerGitHub <noreply@github.com>2026-09-02 07:15:59 -0500
commit5b5c5f1277b165045123acae4a2470261fbad566 (patch)
tree8c43d13c61b282d889898cc03e55ffc25a82c62e /src/util_reference_tree.ml
parent07636e49b3a04fdc76ac42bd65df88736c3945f1 (diff)
parentf7b4459ba3c6551f8d054456b0d5013a4b0e3ee1 (diff)
downloadvyos1x-config-rolling.tar.gz
vyos1x-config-rolling.zip
Merge pull request #92 from jestabro/reference-tree-utilsrolling
T9231: Add reference_tree utils to return paths satisfying condition
Diffstat (limited to 'src/util_reference_tree.ml')
-rw-r--r--src/util_reference_tree.ml133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/util_reference_tree.ml b/src/util_reference_tree.ml
new file mode 100644
index 0000000..018489e
--- /dev/null
+++ b/src/util_reference_tree.ml
@@ -0,0 +1,133 @@
+
+open Reference_tree
+
+
+let node_is_tag node =
+ let data = Vytree.data_of_node node in
+ match data.node_type with
+ | `Tag -> true
+ | _ -> false
+
+let node_is_multi node =
+ let data = Vytree.data_of_node node in
+ data.multi
+
+let get_nodes ?(tag_value_placeholder="") (condition: t -> bool) rt =
+ let stored l =
+ match l with
+ | [] -> []
+ | x :: _ -> x
+ in
+ let func ((p, l), acc) rt =
+ match p with
+ | [] -> ((p, l), acc)
+ | _ ->
+ let v = stored l in
+ let v = (Vytree.name_of_node rt) :: v in
+ let acc =
+ if condition rt then
+ List.rev v :: acc
+ else
+ acc
+ in
+ let v =
+ if node_is_tag rt then
+ match tag_value_placeholder with
+ | "" -> v
+ | _ as s -> s :: v
+ else
+ v
+ in ((p, v::l), acc)
+ in
+ let ret = Vytree.fold_tree_with_path_and_stack func (([], []), []) rt in
+ List.rev ret
+
+let get_multi_nodes ?(tag_value_placeholder="") rt =
+ get_nodes ~tag_value_placeholder node_is_multi rt
+
+let get_multi_nodes_yojson ?(tag_value_placeholder="") rt =
+ let ret = get_multi_nodes ~tag_value_placeholder rt in
+ [%to_yojson: string list list] ret |> Yojson.Safe.to_string
+
+let get_tag_nodes ?(tag_value_placeholder="") rt =
+ get_nodes ~tag_value_placeholder node_is_tag rt
+
+let get_tag_nodes_yojson ?(tag_value_placeholder="") rt =
+ let ret = get_tag_nodes ~tag_value_placeholder rt in
+ [%to_yojson: string list list] ret |> Yojson.Safe.to_string
+
+let node_is_of_kind k rt =
+ let data = Vytree.data_of_node rt in
+ List.mem k data.kind
+
+let get_nodes_of_kind ?(tag_value_placeholder="") rt k =
+ get_nodes ~tag_value_placeholder (node_is_of_kind k) rt
+
+let get_nodes_of_kind_yojson ?(tag_value_placeholder="") rt k =
+ let ret = get_nodes_of_kind ~tag_value_placeholder rt k in
+ [%to_yojson: string list list] ret |> Yojson.Safe.to_string
+
+let node_dependency_of_kind k rt =
+ let data = Vytree.data_of_node rt in
+ match data.dependency with
+ | Some c when c.kind = k -> true
+ | _ -> false
+
+let get_rdeps_of_kind ?(tag_value_placeholder="") rt k =
+ get_nodes ~tag_value_placeholder (node_dependency_of_kind k) rt
+
+let get_rdeps_of_kind_yojson ?(tag_value_placeholder="") rt k =
+ let ret = get_rdeps_of_kind ~tag_value_placeholder rt k in
+ [%to_yojson: string list list] ret |> Yojson.Safe.to_string
+
+
+let get_nodes_data ?(tag_value_placeholder="") (data_opt: t -> string option) rt =
+ let stored l =
+ match l with
+ | [] -> []
+ | x :: _ -> x
+ in
+ let func ((p, l), acc) rt =
+ match p with
+ | [] -> ((p, l), acc)
+ | _ ->
+ let v = stored l in
+ let v = (Vytree.name_of_node rt) :: v in
+ let acc =
+ match data_opt rt with
+ | Some o -> (List.rev v, o) :: acc
+ | _ -> acc
+ in
+ let v =
+ if node_is_tag rt then
+ match tag_value_placeholder with
+ | "" -> v
+ | _ as s -> s :: v
+ else
+ v
+ in ((p, v::l), acc)
+ in
+ let ret = Vytree.fold_tree_with_path_and_stack func (([], []), []) rt in
+ List.rev ret
+
+let node_dependency_of_kind_opt k rt =
+ let data = Vytree.data_of_node rt in
+ match data.dependency with
+ | Some c when c.kind = k -> Some c.alert
+ | _ -> None
+
+let get_rdeps_of_kind_data ?(tag_value_placeholder="") rt k =
+ get_nodes_data ~tag_value_placeholder (node_dependency_of_kind_opt k) rt
+
+let get_rdeps_of_kind_data_yojson ?(tag_value_placeholder="") rt k =
+ let ret = get_rdeps_of_kind_data ~tag_value_placeholder rt k in
+ [%to_yojson: (string list * string) list] ret |> Yojson.Safe.to_string
+
+let get_path_owner reftree path =
+ if Util.is_empty path then None
+ else
+ if not ((Vytree.exists[@alert "-exn"]) reftree path) then None
+ else
+ let func data = data.owner in
+ (get_ceil_data[@alert "-exn"]) func reftree path
+