Add yang-cli

The original idea for this was that I would libyang C++ bindings for
this. Unfortunately, there have been problems with them as explained
here: https://github.com/CESNET/libyang/issues/1106. The easiest
solution to this was to just use the C api of libyang. After creating
some safe wrappers around pointers, it wasn't too difficult.

Change-Id: I0421cb64df66c640956501e56ffc4122eef0b9b7
diff --git a/CMakeLists.txt b/CMakeLists.txt
index baec077..4b2f0bc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -111,6 +111,12 @@
 
 target_link_libraries(netconfaccess PUBLIC datastoreaccess yangschema ast_values utils PRIVATE PkgConfig::LIBNETCONF2)
 
+add_library(yangaccess STATIC
+    src/yang_access.cpp
+    )
+
+target_link_libraries(yangaccess PUBLIC datastoreaccess yangschema)
+
 add_library(yangschema STATIC
     src/yang_schema.cpp
     src/libyang_utils.cpp
@@ -127,15 +133,28 @@
     )
 target_link_libraries(parser schemas utils ast_values)
 
+# Links libraries, that aren't specific to a datastore type
+function(cli_link_required cli_target)
+    target_include_directories(${cli_target} PRIVATE ${REPLXX_PATH})
+    target_link_libraries(${cli_target} yangschema docopt parser ${REPLXX_LIBRARY})
+    add_dependencies(${cli_target} target-NETCONF_CLI_VERSION)
+    target_include_directories(${cli_target} PRIVATE ${PROJECT_BINARY_DIR})
+endfunction()
+
 add_executable(sysrepo-cli
     src/cli.cpp
     )
 target_compile_definitions(sysrepo-cli PRIVATE SYSREPO_CLI)
-target_include_directories(sysrepo-cli PRIVATE ${REPLXX_PATH})
-target_link_libraries(sysrepo-cli sysrepoaccess yangschema docopt parser ${REPLXX_LIBRARY})
+target_link_libraries(sysrepo-cli sysrepoaccess)
+cli_link_required(sysrepo-cli)
 
-add_dependencies(sysrepo-cli target-NETCONF_CLI_VERSION)
-target_include_directories(sysrepo-cli PRIVATE ${PROJECT_BINARY_DIR})
+add_executable(yang-cli
+    src/cli.cpp
+    )
+target_compile_definitions(yang-cli PRIVATE YANG_CLI)
+cli_link_required(yang-cli)
+target_link_libraries(yang-cli yangaccess)
+
 
 include(CTest)
 if(BUILD_TESTING)
@@ -201,6 +220,7 @@
     set(NETOPEER_SOCKET_PATH "${CMAKE_CURRENT_BINARY_DIR}/netopeer2-server.sock")
     configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tests/start_daemons.sh.in ${CMAKE_CURRENT_BINARY_DIR}/start_daemons.sh @ONLY)
     configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tests/netopeer_vars.hpp.in ${CMAKE_CURRENT_BINARY_DIR}/netopeer_vars.hpp @ONLY)
+    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tests/yang_access_test_vars.hpp.in ${CMAKE_CURRENT_BINARY_DIR}/yang_access_test_vars.hpp @ONLY)
 
     function(setup_datastore_tests)
         add_test(NAME setup_netopeer COMMAND ${SYSREPOCFG_EXECUTABLE} ietf-netconf-server -i ${CMAKE_CURRENT_SOURCE_DIR}/tests/netopeer-test-config.xml --datastore=startup --format=xml)
@@ -246,6 +266,8 @@
             target_link_libraries(${TESTNAME} sysrepoaccess)
         elseif (${backend} STREQUAL "netconf")
             target_link_libraries(${TESTNAME} netconfaccess)
+        elseif (${backend} STREQUAL "yang")
+            target_link_libraries(${TESTNAME} yangaccess)
         else()
             message(FATAL_ERROR "Unknown backend ${backend}")
         endif()
@@ -257,6 +279,7 @@
     function(datastore_test name model)
         datastore_test_impl(${name} ${model} sysrepo)
         datastore_test_impl(${name} ${model} netconf)
+        datastore_test_impl(${name} ${model} yang)
     endfunction()
 
     cli_test(cd)