summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@baturin.org>2018-09-02 13:03:12 +0200
committerDaniil Baturin <daniil@baturin.org>2018-09-02 13:03:12 +0200
commitd33442c2576793420802bbd54127923079c487c4 (patch)
treeb6e0499807b85c4b1500a9905e77379ba083386f
parent05b086a782eeee8c2b0566660d942ec0909da6fb (diff)
downloadvyconf-d33442c2576793420802bbd54127923079c487c4.tar.gz
vyconf-d33442c2576793420802bbd54127923079c487c4.zip
Add support for node renaming.
-rw-r--r--src/vytree.ml12
-rw-r--r--src/vytree.mli2
-rw-r--r--test/vytree_test.ml10
3 files changed, 24 insertions, 0 deletions
diff --git a/src/vytree.ml b/src/vytree.ml
index b200cc4..57c3612 100644
--- a/src/vytree.ml
+++ b/src/vytree.ml
@@ -43,6 +43,11 @@ let replace node child =
let children' = Vylist.replace (fun x -> x.name = name) child children in
{ node with children = children' }
+let replace_full node child name =
+ let children = node.children in
+ let children' = Vylist.replace (fun x -> x.name = name) child children in
+ { node with children = children' }
+
let find node name =
Vylist.find (fun x -> x.name = name) node.children
@@ -131,6 +136,13 @@ let rec insert_multi_level default_data node path_done path_remaining data =
let delete node path =
do_with_child delete_immediate node path
+let rename node path newname =
+ let rename_immediate newname' node' name' =
+ let child = find_or_fail node' name' in
+ let child = { child with name=newname' } in
+ replace_full node' child name'
+ in do_with_child (rename_immediate newname) node path
+
let update node path data =
let update_data data' node' name =
let child = find_or_fail node' name in
diff --git a/src/vytree.mli b/src/vytree.mli
index da593f1..556ca77 100644
--- a/src/vytree.mli
+++ b/src/vytree.mli
@@ -29,6 +29,8 @@ val delete : 'a t -> string list -> 'a t
val update : 'a t -> string list -> 'a -> 'a t
+val rename : 'a t -> string list -> string -> 'a t
+
val list_children : 'a t -> string list
val get : 'a t -> string list -> 'a t
diff --git a/test/vytree_test.ml b/test/vytree_test.ml
index 4da2335..23c52ce 100644
--- a/test/vytree_test.ml
+++ b/test/vytree_test.ml
@@ -107,6 +107,15 @@ let test_update test_ctxt =
let node = insert node ["foo"] 1 in
assert_equal (data_of_node (get (update node ["foo"] 9) ["foo"])) 9
+(* rename works *)
+let test_rename test_ctxt =
+ let node = make 0 "root" in
+ let node = insert node ["foo"] 1 in
+ let node = insert node ["bar"] 2 in
+ let node' = rename node ["bar"] "quux" in
+ let child_quux = get node' ["quux"] in
+ assert_equal (data_of_node child_quux) 2
+
(* get_existent_path works *)
let test_get_existent_path test_ctxt =
let node = make () "root" in
@@ -171,6 +180,7 @@ let suite =
"test_get_child_multilevel" >:: test_get_child_multilevel;
"test_get_child_nonexistent" >:: test_get_child_nonexistent;
"test_update" >:: test_update;
+ "test_rename" >:: test_rename;
"test_get_existent_path" >:: test_get_existent_path;
"test_exists_existent" >:: test_exists_existent;
"test_exists_nonexistent" >:: test_exists_nonexistent;