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")