summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@baturin.org>2015-04-26 17:49:28 +0600
committerDaniil Baturin <daniil@baturin.org>2015-04-26 17:49:28 +0600
commitde448723e5a9443f5df7f367e70990c58a9a04e3 (patch)
treeacf564a093b9fce649f6d4d4651364084395a176
parent3891244d49d3c65ef6da6b8644cfb9097b0d51b0 (diff)
downloadvyconf-de448723e5a9443f5df7f367e70990c58a9a04e3.tar.gz
vyconf-de448723e5a9443f5df7f367e70990c58a9a04e3.zip
Add config tree module.
-rw-r--r--_oasis19
-rw-r--r--src/config_tree.ml36
-rw-r--r--src/config_tree.mli25
-rw-r--r--test/config_tree_test.ml42
4 files changed, 122 insertions, 0 deletions
diff --git a/_oasis b/_oasis
index ed5c321..51c66ab 100644
--- a/_oasis
+++ b/_oasis
@@ -27,6 +27,11 @@ Library "reference_tree"
FindlibParent: vyconf
BuildDepends: xml-light, pcre
+Library "config_tree"
+ Path: src
+ Modules: Config_tree
+ FindlibParent: vyconf
+
Library "value_checker"
Path: src
Modules: Value_checker
@@ -60,6 +65,14 @@ Executable "reference_tree_test"
Install: false
BuildDepends: oUnit, xml-light, pcre, vyconf
+Executable "config_tree_test"
+ Path: test
+ MainIs: config_tree_test.ml
+ Build$: flag(tests)
+ CompiledObject: best
+ Install: false
+ BuildDepends: oUnit, vyconf
+
Executable "vylist_test"
Path: test
MainIs: vylist_test.ml
@@ -96,6 +109,12 @@ Test "reference_tree_test"
Command: $reference_tree_test
WorkingDirectory: test
+Test "config_tree_test"
+ Run$: flag(tests)
+ TestTools: config_tree_test
+ Command: $config_tree_test
+ WorkingDirectory: test
+
Test "vylist_test"
Run$: flag(tests)
TestTools: vylist_test
diff --git a/src/config_tree.ml b/src/config_tree.ml
new file mode 100644
index 0000000..289cf7e
--- /dev/null
+++ b/src/config_tree.ml
@@ -0,0 +1,36 @@
+exception Duplicate_value
+
+type config_node_data = {
+ values: string list;
+ comment: string;
+ node_type: Vytree.node_type;
+}
+
+type t = config_node_data Vytree.t
+
+let default_data = {
+ values = [];
+ comment = "";
+ node_type = Vytree.Other;
+}
+
+let make = Vytree.make default_data
+
+let set_value node path value =
+ let data = { default_data with values=[value] } in
+ Vytree.update node path data
+
+let add_value node path value =
+ let node' = Vytree.get node path in
+ let data = Vytree.data_of_node node' in
+ let values = data.values in
+ match (Vylist.find (fun x -> x = value) values) with
+ | Some _ -> raise Duplicate_value
+ | None ->
+ let values = values @ [value] in
+ Vytree.update node path ({data with values=values})
+
+let get_values node path =
+ let node' = Vytree.get node path in
+ let data = Vytree.data_of_node node' in
+ data.values
diff --git a/src/config_tree.mli b/src/config_tree.mli
new file mode 100644
index 0000000..93a8b76
--- /dev/null
+++ b/src/config_tree.mli
@@ -0,0 +1,25 @@
+exception Duplicate_value
+
+type config_node_data = {
+ values : string list;
+ comment : string;
+ node_type : Vytree.node_type;
+}
+
+type t = config_node_data Vytree.t
+
+val default_data : config_node_data
+
+val make : string -> config_node_data Vytree.t
+
+val set_value :
+ config_node_data Vytree.t ->
+ string list -> string -> config_node_data Vytree.t
+
+val add_value :
+ config_node_data Vytree.t ->
+ string list -> string -> config_node_data Vytree.t
+
+val get_values :
+ config_node_data Vytree.t ->
+ string list -> string list
diff --git a/test/config_tree_test.ml b/test/config_tree_test.ml
new file mode 100644
index 0000000..625bd2b
--- /dev/null
+++ b/test/config_tree_test.ml
@@ -0,0 +1,42 @@
+open OUnit2
+
+module VT = Vytree
+open Config_tree
+
+let test_set_value test_ctxt =
+ let node = make "root" in
+ let node = VT.insert node ["foo"] default_data in
+ let node = set_value node ["foo"] "bar" in
+ let data = VT.data_of_node (VT.get node ["foo"]) in
+ assert_equal data.values ["bar"]
+
+let test_get_values test_ctxt =
+ let node = make "root" in
+ let node = VT.insert node ["foo"] default_data in
+ let node = set_value node ["foo"] "bar" in
+ assert_equal (get_values node ["foo"]) ["bar"]
+
+let test_add_value test_ctxt =
+ let node = make "root" in
+ let node = VT.insert node ["foo"] default_data in
+ let node = add_value node ["foo"] "bar" in
+ let node = add_value node ["foo"] "baz" in
+ assert_equal (get_values node ["foo"]) ["bar"; "baz"]
+
+let test_add_value_duplicate test_ctxt =
+ let node = make "root" in
+ let node = VT.insert node ["foo"] default_data in
+ let node = set_value node ["foo"] "bar" in
+ assert_raises Duplicate_value (fun () -> add_value node ["foo"] "bar")
+
+let suite =
+ "VyConf config tree tests" >::: [
+ "test_set_value" >:: test_set_value;
+ "test_get_values" >:: test_get_values;
+ "test_add_value" >:: test_add_value;
+ "test_add_value_duplicate" >:: test_add_value_duplicate;
+ ]
+
+let () =
+ run_test_tt_main suite
+