diff options
| author | John Estabrook <jestabro@vyos.io> | 2026-09-02 07:15:59 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-02 07:15:59 -0500 |
| commit | 5b5c5f1277b165045123acae4a2470261fbad566 (patch) | |
| tree | 8c43d13c61b282d889898cc03e55ffc25a82c62e /src/util_reference_tree.ml | |
| parent | 07636e49b3a04fdc76ac42bd65df88736c3945f1 (diff) | |
| parent | f7b4459ba3c6551f8d054456b0d5013a4b0e3ee1 (diff) | |
| download | vyos1x-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.ml | 133 |
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 + |
