Open
Description
We have following code (simplified for the purpose of example):
// ...
libyang::Context *context;
// ...
// ...
YangModule::YangModule() {
this->context = new libyang::Context(std::nullopt, libyang::ContextOptions::SetPrivParsed);
}
// ...
/*
* Validates the data tree against the schema.
*
* @param dataTreeJson The data tree to validate
* @return `true` if the data tree is valid, `false` otherwise
*/
bool YangModule::validateData(const std::string &dataTreeJson) const {
// Errors are automatically truncated every function call
this->clearErrors();
try {
std::optional<libyang::DataNode> dataNode = this->context->parseDataMem(
dataTreeJson,
libyang::DataFormat::JSON,
libyang::ParseOptions::ParseOnly,
libyang::ValidationOptions::Present
);
validateAll(dataNode, libyang::ValidationOptions::Present);
} catch (...) {
return false;
}
// Errors are automatically truncated every function call
return this->getErrors().empty();
}
If parseDataMem (respectively parseData in new version) returns std::nullopt
instead of DataNode
, and you pass it to the validateAll
, libyang returns following error libyang[0]: Invalid argument tree (lyd_validate_all()).
I can provide example schema later, but the problem might be that std::optional<DataNode> Context::parseData
returns std::nullopt
when !tree
. Colleague that use libyang (not libyang-cpp) says it works fine in C:
lyd_parse_data_mem(ctx, "{}", LYD_JSON, LYD_PARSE_ONLY, 0, &dnode);
// lyd_parse_data_mem(ctx, "", LYD_XML, LYD_PARSE_ONLY, 0, &dnode);
lyd_validate_all(&dnode, ctx, LYD_VALIDATE_PRESENT, NULL);
If he passes NULL
instead of empty object, it the returns the same error as I mentioned before.
We think that C++ implementation is not correct.
Metadata
Metadata
Assignees
Labels
No labels