Add leafrefPath(const std::string&)

Will be useful in the upcoming describe command.

Change-Id: I480b93491f98c23eab6498503ca07d6b7c9c8e4f
diff --git a/src/schema.hpp b/src/schema.hpp
index 137dbe9..a45149a 100644
--- a/src/schema.hpp
+++ b/src/schema.hpp
@@ -78,6 +78,7 @@
     virtual yang::LeafDataTypes leafType(const std::string& path) const = 0;
     virtual yang::LeafDataTypes leafrefBaseType(const schemaPath_& location, const ModuleNodePair& node) const = 0;
     virtual yang::LeafDataTypes leafrefBaseType(const std::string& path) const = 0;
+    virtual std::string leafrefPath(const std::string& leafrefPath) const = 0;
     virtual std::optional<std::string> description(const std::string& location) const = 0;
     virtual std::optional<std::string> units(const std::string& location) const = 0;
 
diff --git a/src/static_schema.cpp b/src/static_schema.cpp
index 14b5666..511e420 100644
--- a/src/static_schema.cpp
+++ b/src/static_schema.cpp
@@ -295,3 +295,8 @@
 {
     throw std::runtime_error{"Internal error: StaticSchema::leafrefBaseType(std::string) not implemented. The tests should not have called this overload."};
 }
+
+std::string StaticSchema::leafrefPath([[maybe_unused]] const std::string& leafrefPath) const
+{
+    throw std::runtime_error{"Internal error: StaticSchema::leafrefPath(std::string) not implemented. The tests should not have called this overload."};
+}
diff --git a/src/static_schema.hpp b/src/static_schema.hpp
index 1328a93..c586083 100644
--- a/src/static_schema.hpp
+++ b/src/static_schema.hpp
@@ -59,6 +59,7 @@
     yang::LeafDataTypes leafType(const std::string& path) const override;
     yang::LeafDataTypes leafrefBaseType(const schemaPath_& location, const ModuleNodePair& node) const override;
     yang::LeafDataTypes leafrefBaseType(const std::string& path) const override;
+    std::string leafrefPath(const std::string& leafrefPath) const override;
     const std::set<std::string> enumValues(const schemaPath_& location, const ModuleNodePair& node) const override;
     const std::set<std::string> validIdentities(const schemaPath_& location, const ModuleNodePair& node, const Prefixes prefixes) const override;
     std::set<std::string> childNodes(const schemaPath_& path, const Recursion) const override;
diff --git a/src/yang_schema.cpp b/src/yang_schema.cpp
index 4b4a8bb..254f8a9 100644
--- a/src/yang_schema.cpp
+++ b/src/yang_schema.cpp
@@ -304,6 +304,13 @@
     return impl_leafrefBaseType(getSchemaNode(path));
 }
 
+std::string YangSchema::leafrefPath(const std::string& leafrefPath) const
+{
+    using namespace std::string_literals;
+    libyang::Schema_Node_Leaf leaf(getSchemaNode(leafrefPath));
+    return leaf.type()->info()->lref()->target()->path(LYS_PATH_FIRST_PREFIX);
+}
+
 std::set<std::string> YangSchema::modules() const
 {
     const auto& modules = m_context->get_module_iter();
diff --git a/src/yang_schema.hpp b/src/yang_schema.hpp
index ad112e7..e610383 100644
--- a/src/yang_schema.hpp
+++ b/src/yang_schema.hpp
@@ -41,6 +41,7 @@
     yang::LeafDataTypes leafType(const std::string& path) const override;
     yang::LeafDataTypes leafrefBaseType(const schemaPath_& location, const ModuleNodePair& node) const override;
     yang::LeafDataTypes leafrefBaseType(const std::string& path) const override;
+    std::string leafrefPath(const std::string& leafrefPath) const override;
     const std::set<std::string> validIdentities(const schemaPath_& location, const ModuleNodePair& node, const Prefixes prefixes) const override;
     const std::set<std::string> enumValues(const schemaPath_& location, const ModuleNodePair& node) const override;
     std::set<std::string> childNodes(const schemaPath_& path, const Recursion recursion) const override;
diff --git a/tests/yang.cpp b/tests/yang.cpp
index 5f2f0c3..c5f6fa4 100644
--- a/tests/yang.cpp
+++ b/tests/yang.cpp
@@ -290,6 +290,12 @@
         units "vt";
     }
 
+    leaf activeNumber {
+        type leafref {
+            path "/_list/number";
+        }
+    }
+
 })";
 
 namespace std {
@@ -756,7 +762,8 @@
                        "example-schema:ethernet", "example-schema:loopback",
                        "example-schema:pizzaSize",
                        "example-schema:length", "example-schema:wavelength",
-                       "example-schema:duration", "example-schema:another-duration"};
+                       "example-schema:duration", "example-schema:another-duration",
+                       "example-schema:activeNumber"};
             }
 
             SECTION("example-schema:a")
@@ -894,6 +901,11 @@
 
             REQUIRE(ys.nodeType(pathToSchemaString(path, Prefixes::WhenNeeded)) == expected);
         }
+
+        SECTION("leafrefPath")
+        {
+            REQUIRE(ys.leafrefPath("/example-schema:activeNumber") == "/example-schema:_list/number");
+        }
     }
 
     SECTION("negative")