Add node-info getters to Schema
Change-Id: Iffea96cdcf20763286db19b0ee2b92dbf7c69b6c
diff --git a/src/schema.hpp b/src/schema.hpp
index a85961b..e4636cf 100644
--- a/src/schema.hpp
+++ b/src/schema.hpp
@@ -76,6 +76,8 @@
virtual const std::set<std::string> listKeys(const schemaPath_& location, const ModuleNodePair& node) const = 0;
virtual yang::LeafDataTypes leafType(const schemaPath_& location, const ModuleNodePair& node) const = 0;
virtual yang::LeafDataTypes leafrefBase(const schemaPath_& location, const ModuleNodePair& node) 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;
virtual const std::set<std::string> validIdentities(const schemaPath_& location, const ModuleNodePair& node, const Prefixes prefixes) const = 0;
virtual const std::set<std::string> enumValues(const schemaPath_& location, const ModuleNodePair& node) const = 0;
diff --git a/src/static_schema.cpp b/src/static_schema.cpp
index d2287dc..9b4f00b 100644
--- a/src/static_schema.cpp
+++ b/src/static_schema.cpp
@@ -271,6 +271,16 @@
}
}
+std::optional<std::string> StaticSchema::description([[maybe_unused]] const std::string& path) const
+{
+ throw std::runtime_error{"StaticSchema::description not implemented"};
+}
+
+std::optional<std::string> StaticSchema::units([[maybe_unused]] const std::string& path) const
+{
+ throw std::runtime_error{"StaticSchema::units not implemented"};
+}
+
yang::NodeTypes StaticSchema::nodeType([[maybe_unused]] const std::string& path) const
{
throw std::runtime_error{"Internal error: StaticSchema::nodeType(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 c2623a5..a63f92c 100644
--- a/src/static_schema.hpp
+++ b/src/static_schema.hpp
@@ -61,6 +61,8 @@
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;
std::set<std::string> moduleNodes(const module_& module, const Recursion recursion) const override;
+ std::optional<std::string> description(const std::string& path) const override;
+ std::optional<std::string> units(const std::string& path) const override;
void addContainer(const std::string& location, const std::string& name, yang::ContainerTraits isPresence = yang::ContainerTraits::None);
void addLeaf(const std::string& location, const std::string& name, const yang::LeafDataTypes& type);
diff --git a/src/yang_schema.cpp b/src/yang_schema.cpp
index 10565d3..d915eef 100644
--- a/src/yang_schema.cpp
+++ b/src/yang_schema.cpp
@@ -416,3 +416,34 @@
{
return impl_nodeType(getSchemaNode(path));
}
+
+std::optional<std::string> YangSchema::description(const std::string& path) const
+{
+ auto node = getSchemaNode(path.c_str());
+ return node->dsc() ? std::optional{node->dsc()} : std::nullopt;
+}
+
+std::optional<std::string> YangSchema::units(const std::string& path) const
+{
+ auto node = getSchemaNode(path.c_str());
+ if (node->nodetype() != LYS_LEAF) {
+ return std::nullopt;
+ }
+ libyang::Schema_Node_Leaf leaf{node};
+ auto units = leaf.units();
+
+ // A leaf can specify units as part of its definition.
+ if (units) {
+ return units;
+ }
+
+ // A typedef (or its parent typedefs) can specify units too. We'll use the first `units` we find.
+ for (auto parentTypedef = leaf.type()->der(); parentTypedef; parentTypedef = parentTypedef->type()->der()) {
+ units = parentTypedef->units();
+ if (units) {
+ return units;
+ }
+ }
+
+ return std::nullopt;
+}
diff --git a/src/yang_schema.hpp b/src/yang_schema.hpp
index ea204e2..8471bea 100644
--- a/src/yang_schema.hpp
+++ b/src/yang_schema.hpp
@@ -43,6 +43,8 @@
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;
std::set<std::string> moduleNodes(const module_& module, const Recursion recursion) const override;
+ std::optional<std::string> description(const std::string& path) const override;
+ std::optional<std::string> units(const std::string& path) const override;
void registerModuleCallback(const std::function<std::string(const char*, const char*, const char*, const char*)>& clb);