rename some of the classes
CParser is now just parser. CTree is now Schema. The namespace "schema" is
now called "yang".
Change-Id: Ief9c22fb6a7633b80010d355f9582e313e818d45
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2c9975e..7513c87 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -55,8 +55,8 @@
add_definitions(-DBOOST_SPIRIT_X3_NO_FILESYSTEM)
set(parser_SRCS
- src/CTree.cpp
- src/CParser.cpp
+ src/schema.cpp
+ src/parser.cpp
src/ast.cpp
src/utils.cpp
src/parser_context.cpp
diff --git a/src/CTree.cpp b/src/CTree.cpp
deleted file mode 100644
index 6840697..0000000
--- a/src/CTree.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2018 CESNET, https://photonics.cesnet.cz/
- * Copyright (C) 2018 FIT CVUT, https://fit.cvut.cz/
- *
- * Written by Václav Kubernát <kubervac@fit.cvut.cz>
- *
-*/
-
-#include <iostream>
-#include "CTree.hpp"
-#include "utils.hpp"
-
-InvalidNodeException::~InvalidNodeException() = default;
-
-
-std::string pathToString(const path_& path)
-{
- std::string res;
- for (const auto it : path.m_nodes)
- res = joinPaths(res, boost::apply_visitor(nodeToString(), it));
- return res;
-}
-
-CTree::CTree()
-{
- m_nodes.emplace("", std::unordered_map<std::string, NodeType>());
-}
-
-const std::unordered_map<std::string, NodeType>& CTree::children(const std::string& name) const
-{
- return m_nodes.at(name);
-}
-
-bool CTree::nodeExists(const std::string& location, const std::string& name) const
-{
- if (name.empty())
- return true;
- const auto& childrenRef = children(location);
-
- return childrenRef.find(name) != childrenRef.end();
-}
-
-bool CTree::isContainer(const path_& location, const std::string& name) const
-{
- std::string locationString = pathToString(location);
- if (!nodeExists(locationString, name))
- return false;
-
- return children(locationString).at(name).type() == typeid(schema::container);
-}
-
-void CTree::addContainer(const std::string& location, const std::string& name)
-{
- m_nodes.at(location).emplace(name, schema::container{});
-
- //create a new set of children for the new node
- std::string key = joinPaths(location, name);
- m_nodes.emplace(key, std::unordered_map<std::string, NodeType>());
-}
-
-
-bool CTree::listHasKey(const path_& location, const std::string& name, const std::string& key) const
-{
- std::string locationString = pathToString(location);
- assert(isList(location, name));
-
- const auto& child = children(locationString).at(name);
- const auto& list = boost::get<schema::list>(child);
- return list.m_keys.find(key) != list.m_keys.end();
-}
-
-const std::set<std::string>& CTree::listKeys(const path_& location, const std::string& name) const
-{
- std::string locationString = pathToString(location);
- assert(isList(location, name));
-
- const auto& child = children(locationString).at(name);
- const auto& list = boost::get<schema::list>(child);
- return list.m_keys;
-}
-
-bool CTree::isList(const path_& location, const std::string& name) const
-{
- std::string locationString = pathToString(location);
- if (!nodeExists(locationString, name))
- return false;
- const auto& child = children(locationString).at(name);
- if (child.type() != typeid(schema::list))
- return false;
-
- return true;
-}
-
-void CTree::addList(const std::string& location, const std::string& name, const std::set<std::string>& keys)
-{
- m_nodes.at(location).emplace(name, schema::list{keys});
-
- m_nodes.emplace(name, std::unordered_map<std::string, NodeType>());
-}
-
diff --git a/src/ast.cpp b/src/ast.cpp
index 9c96bd2..9345192 100644
--- a/src/ast.cpp
+++ b/src/ast.cpp
@@ -40,5 +40,3 @@
{
return this->m_path == b.m_path;
}
-
-
diff --git a/src/ast.hpp b/src/ast.hpp
index 0c257d0..90e007a 100644
--- a/src/ast.hpp
+++ b/src/ast.hpp
@@ -21,14 +21,14 @@
namespace x3 = boost::spirit::x3;
namespace ascii = boost::spirit::x3::ascii;
-using x3::alpha;
-using x3::alnum;
-using x3::lit;
-using x3::char_;
-using x3::_attr;
-using x3::lexeme;
-using x3::expect;
using ascii::space;
+using x3::_attr;
+using x3::alnum;
+using x3::alpha;
+using x3::char_;
+using x3::expect;
+using x3::lexeme;
+using x3::lit;
using boost::fusion::operator<<;
@@ -41,7 +41,7 @@
struct nodeup_ {
bool operator==(const nodeup_&) const
{
- return true;
+ return true;
}
};
diff --git a/src/ast_handlers.hpp b/src/ast_handlers.hpp
index ce8a196..0c7f1c3 100644
--- a/src/ast_handlers.hpp
+++ b/src/ast_handlers.hpp
@@ -8,20 +8,20 @@
#pragma once
-#include "CTree.hpp"
#include "parser_context.hpp"
+#include "schema.hpp"
struct keyValue_class {
template <typename T, typename Iterator, typename Context>
void on_success(Iterator const&, Iterator const&, T& ast, Context const& context)
{
auto& parserContext = x3::get<parser_context_tag>(context);
- const CTree& tree = parserContext.m_tree;
+ const Schema& schema = parserContext.m_schema;
if (parserContext.m_tmpListKeys.find(ast.first) != parserContext.m_tmpListKeys.end()) {
_pass(context) = false;
parserContext.m_errorMsg = "Key \"" + ast.first + "\" was entered more than once.";
- } else if (tree.listHasKey(parserContext.m_curPath, parserContext.m_tmpListName, ast.first)) {
+ } else if (schema.listHasKey(parserContext.m_curPath, parserContext.m_tmpListName, ast.first)) {
parserContext.m_tmpListKeys.insert(ast.first);
} else {
_pass(context) = false;
@@ -36,9 +36,9 @@
void on_success(Iterator const&, Iterator const&, T& ast, Context const& context)
{
auto& parserContext = x3::get<parser_context_tag>(context);
- const CTree& tree = parserContext.m_tree;
+ const Schema& schema = parserContext.m_schema;
- if (tree.isList(parserContext.m_curPath, ast)) {
+ if (schema.isList(parserContext.m_curPath, ast)) {
parserContext.m_tmpListName = ast;
} else {
_pass(context) = false;
@@ -51,9 +51,9 @@
void on_success(Iterator const&, Iterator const&, T& ast, Context const& context)
{
auto& parserContext = x3::get<parser_context_tag>(context);
- const CTree& tree = parserContext.m_tree;
+ const Schema& schema = parserContext.m_schema;
- const auto& keysNeeded = tree.listKeys(parserContext.m_curPath, parserContext.m_tmpListName);
+ const auto& keysNeeded = schema.listKeys(parserContext.m_curPath, parserContext.m_tmpListName);
std::set<std::string> keysSupplied;
for (const auto& it : ast)
keysSupplied.insert(it.first);
@@ -119,9 +119,9 @@
void on_success(Iterator const&, Iterator const&, T& ast, Context const& context)
{
auto& parserContext = x3::get<parser_context_tag>(context);
- const auto& tree = parserContext.m_tree;
+ const auto& schema = parserContext.m_schema;
- if (tree.isContainer(parserContext.m_curPath, ast.m_name)) {
+ if (schema.isContainer(parserContext.m_curPath, ast.m_name)) {
parserContext.m_curPath.m_nodes.push_back(ast);
} else {
_pass(context) = false;
diff --git a/src/main.cpp b/src/main.cpp
index 607115e..c40f2ae 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -10,9 +10,9 @@
#include <docopt.h>
#include <iostream>
#include <string>
-#include "CParser.hpp"
-#include "CTree.hpp"
#include "NETCONF_CLI_VERSION.h"
+#include "parser.hpp"
+#include "schema.hpp"
static const char usage[] =
@@ -28,16 +28,16 @@
namespace ascii = boost::spirit::x3::ascii;
using Cmd = std::vector<std::string>;
-using x3::alpha;
-using x3::lit;
-using x3::char_;
-using x3::_attr;
-using x3::lexeme;
using ascii::space;
+using x3::_attr;
+using x3::alpha;
+using x3::char_;
+using x3::lexeme;
+using x3::lit;
-void interpret(cd_ command, CParser& tree)
+void interpret(cd_ command, Parser& parser)
{
- tree.changeNode(command.m_path);
+ parser.changeNode(command.m_path);
}
int main(int argc, char* argv[])
@@ -49,17 +49,17 @@
true);
std::cout << "Welcome to netconf-cli" << std::endl;
- CTree tree;
- tree.addContainer("", "a");
- tree.addContainer("", "b");
- tree.addContainer("a", "a2");
- tree.addContainer("b", "b2");
- tree.addContainer("a/a2", "a3");
- tree.addContainer("b/b2", "b3");
- tree.addList("", "list", {"number"});
- tree.addContainer("list", "contInList");
- tree.addList("", "twoKeyList", {"number", "name"});
- CParser parser(tree);
+ Schema schema;
+ schema.addContainer("", "a");
+ schema.addContainer("", "b");
+ schema.addContainer("a", "a2");
+ schema.addContainer("b", "b2");
+ schema.addContainer("a/a2", "a3");
+ schema.addContainer("b/b2", "b3");
+ schema.addList("", "list", {"number"});
+ schema.addContainer("list", "contInList");
+ schema.addList("", "twoKeyList", {"number", "name"});
+ Parser parser(schema);
while (true) {
std::cout << parser.currentNode() << ">";
diff --git a/src/CParser.cpp b/src/parser.cpp
similarity index 81%
rename from src/CParser.cpp
rename to src/parser.cpp
index cb81de0..87ed317 100644
--- a/src/CParser.cpp
+++ b/src/parser.cpp
@@ -6,22 +6,22 @@
*
*/
#include <ostream>
-#include "CParser.hpp"
+#include "parser.hpp"
TooManyArgumentsException::~TooManyArgumentsException() = default;
InvalidCommandException::~InvalidCommandException() = default;
-CParser::CParser(const CTree& tree)
- : m_tree(tree)
+Parser::Parser(const Schema& schema)
+ : m_schema(schema)
{
}
-cd_ CParser::parseCommand(const std::string& line, std::ostream& errorStream)
+cd_ Parser::parseCommand(const std::string& line, std::ostream& errorStream)
{
cd_ parsedCommand;
- ParserContext ctx(m_tree, m_curDir);
+ ParserContext ctx(m_schema, m_curDir);
auto it = line.begin();
boost::spirit::x3::error_handler<std::string::const_iterator> errorHandler(it, line.end(), errorStream);
@@ -39,7 +39,7 @@
return parsedCommand;
}
-void CParser::changeNode(const path_& name)
+void Parser::changeNode(const path_& name)
{
for (const auto& it : name.m_nodes) {
if (it.type() == typeid(nodeup_))
@@ -49,7 +49,7 @@
}
}
-std::string CParser::currentNode() const
+std::string Parser::currentNode() const
{
std::string res;
for (const auto& it : m_curDir.m_nodes) {
diff --git a/src/CParser.hpp b/src/parser.hpp
similarity index 92%
rename from src/CParser.hpp
rename to src/parser.hpp
index bf21300..feb7911 100644
--- a/src/CParser.hpp
+++ b/src/parser.hpp
@@ -12,12 +12,12 @@
namespace x3 = boost::spirit::x3;
namespace ascii = boost::spirit::x3::ascii;
using Cmd = std::vector<std::string>;
-using x3::alpha;
-using x3::lit;
-using x3::char_;
-using x3::_attr;
-using x3::lexeme;
using ascii::space;
+using x3::_attr;
+using x3::alpha;
+using x3::char_;
+using x3::lexeme;
+using x3::lit;
class InvalidCommandException : public std::invalid_argument {
public:
@@ -32,14 +32,14 @@
};
-class CParser {
+class Parser {
public:
- CParser(const CTree& tree);
+ Parser(const Schema& schema);
cd_ parseCommand(const std::string& line, std::ostream& errorStream);
void changeNode(const path_& name);
std::string currentNode() const;
private:
- const CTree& m_tree;
+ const Schema& m_schema;
path_ m_curDir;
};
diff --git a/src/parser_context.cpp b/src/parser_context.cpp
index db2bb43..d3b4a90 100644
--- a/src/parser_context.cpp
+++ b/src/parser_context.cpp
@@ -7,8 +7,8 @@
*/
#include "parser_context.hpp"
-ParserContext::ParserContext(const CTree& tree, const path_ curDir)
- : m_tree(tree)
+ParserContext::ParserContext(const Schema& schema, const path_ curDir)
+ : m_schema(schema)
{
m_curPath = curDir;
}
diff --git a/src/parser_context.hpp b/src/parser_context.hpp
index 2c90120..99c1a63 100644
--- a/src/parser_context.hpp
+++ b/src/parser_context.hpp
@@ -6,10 +6,10 @@
*
*/
-#include "CTree.hpp"
+#include "schema.hpp"
struct ParserContext {
- ParserContext(const CTree& tree, const path_ curDir);
- const CTree& m_tree;
+ ParserContext(const Schema& schema, const path_ curDir);
+ const Schema& m_schema;
path_ m_curPath;
std::string m_errorMsg;
std::string m_tmpListName;
diff --git a/src/schema.cpp b/src/schema.cpp
new file mode 100644
index 0000000..aaaab8b
--- /dev/null
+++ b/src/schema.cpp
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2018 CESNET, https://photonics.cesnet.cz/
+ * Copyright (C) 2018 FIT CVUT, https://fit.cvut.cz/
+ *
+ * Written by Václav Kubernát <kubervac@fit.cvut.cz>
+ *
+*/
+
+#include <iostream>
+#include "schema.hpp"
+#include "utils.hpp"
+
+InvalidNodeException::~InvalidNodeException() = default;
+
+
+std::string pathToString(const path_& path)
+{
+ std::string res;
+ for (const auto it : path.m_nodes)
+ res = joinPaths(res, boost::apply_visitor(nodeToString(), it));
+ return res;
+}
+
+Schema::Schema()
+{
+ m_nodes.emplace("", std::unordered_map<std::string, NodeType>());
+}
+
+const std::unordered_map<std::string, NodeType>& Schema::children(const std::string& name) const
+{
+ return m_nodes.at(name);
+}
+
+bool Schema::nodeExists(const std::string& location, const std::string& name) const
+{
+ if (name.empty())
+ return true;
+ const auto& childrenRef = children(location);
+
+ return childrenRef.find(name) != childrenRef.end();
+}
+
+bool Schema::isContainer(const path_& location, const std::string& name) const
+{
+ std::string locationString = pathToString(location);
+ if (!nodeExists(locationString, name))
+ return false;
+
+ return children(locationString).at(name).type() == typeid(yang::container);
+}
+
+void Schema::addContainer(const std::string& location, const std::string& name)
+{
+ m_nodes.at(location).emplace(name, yang::container{});
+
+ //create a new set of children for the new node
+ std::string key = joinPaths(location, name);
+ m_nodes.emplace(key, std::unordered_map<std::string, NodeType>());
+}
+
+
+bool Schema::listHasKey(const path_& location, const std::string& name, const std::string& key) const
+{
+ std::string locationString = pathToString(location);
+ assert(isList(location, name));
+
+ const auto& child = children(locationString).at(name);
+ const auto& list = boost::get<yang::list>(child);
+ return list.m_keys.find(key) != list.m_keys.end();
+}
+
+const std::set<std::string>& Schema::listKeys(const path_& location, const std::string& name) const
+{
+ std::string locationString = pathToString(location);
+ assert(isList(location, name));
+
+ const auto& child = children(locationString).at(name);
+ const auto& list = boost::get<yang::list>(child);
+ return list.m_keys;
+}
+
+bool Schema::isList(const path_& location, const std::string& name) const
+{
+ std::string locationString = pathToString(location);
+ if (!nodeExists(locationString, name))
+ return false;
+ const auto& child = children(locationString).at(name);
+ if (child.type() != typeid(yang::list))
+ return false;
+
+ return true;
+}
+
+void Schema::addList(const std::string& location, const std::string& name, const std::set<std::string>& keys)
+{
+ m_nodes.at(location).emplace(name, yang::list{keys});
+
+ m_nodes.emplace(name, std::unordered_map<std::string, NodeType>());
+}
diff --git a/src/CTree.hpp b/src/schema.hpp
similarity index 77%
rename from src/CTree.hpp
rename to src/schema.hpp
index 8b42371..a414dc9 100644
--- a/src/CTree.hpp
+++ b/src/schema.hpp
@@ -14,12 +14,12 @@
#include <unordered_map>
#include "ast.hpp"
-namespace schema {
- struct container {
- };
- struct list {
- std::set<std::string> m_keys;
- };
+namespace yang {
+struct container {
+};
+struct list {
+ std::set<std::string> m_keys;
+};
}
struct nodeToString : public boost::static_visitor<std::string> {
@@ -34,7 +34,7 @@
}
};
-using NodeType = boost::variant<schema::container, schema::list>;
+using NodeType = boost::variant<yang::container, yang::list>;
class InvalidNodeException : public std::invalid_argument {
@@ -43,15 +43,12 @@
~InvalidNodeException() override;
};
-/*! \class CTree
- * \brief The class representing the tree, that the user traverses.
- *
- * This class holds the current position in the tree and handles changing the position,
- * including checking what nodes are available.
+/*! \class Schema
+ * \brief The class representing the schema, that the user traverses.
* */
-class CTree {
+class Schema {
public:
- CTree();
+ Schema();
bool nodeExists(const std::string& location, const std::string& name) const;
bool isContainer(const path_& location, const std::string& name) const;
diff --git a/tests/cd.cpp b/tests/cd.cpp
index 8ab4c40..83a1f98 100644
--- a/tests/cd.cpp
+++ b/tests/cd.cpp
@@ -7,23 +7,23 @@
*/
#include "trompeloeil_catch.h"
-#include "CParser.hpp"
-#include "CTree.hpp"
#include "ast.hpp"
+#include "parser.hpp"
+#include "schema.hpp"
TEST_CASE("cd")
{
- CTree tree;
- tree.addContainer("", "a");
- tree.addContainer("", "b");
- tree.addContainer("a", "a2");
- tree.addContainer("b", "b2");
- tree.addContainer("a/a2", "a3");
- tree.addContainer("b/b2", "b3");
- tree.addList("", "list", {"number"});
- tree.addContainer("list", "contInList");
- tree.addList("", "twoKeyList", {"number", "name"});
- CParser parser(tree);
+ Schema schema;
+ schema.addContainer("", "a");
+ schema.addContainer("", "b");
+ schema.addContainer("a", "a2");
+ schema.addContainer("b", "b2");
+ schema.addContainer("a/a2", "a3");
+ schema.addContainer("b/b2", "b3");
+ schema.addList("", "list", {"number"});
+ schema.addContainer("list", "contInList");
+ schema.addList("", "twoKeyList", {"number", "name"});
+ Parser parser(schema);
std::string input;
std::ostringstream errorStream;
@@ -58,7 +58,6 @@
expected.m_path.m_nodes.push_back(container_("b"));
expected.m_path.m_nodes.push_back(container_("b2"));
}
-
}
SECTION("list elements")
@@ -67,8 +66,7 @@
{
input = "cd list[number=1]";
auto keys = std::map<std::string, std::string>{
- {"number", "1"}
- };
+ {"number", "1"}};
expected.m_path.m_nodes.push_back(listElement_("list", keys));
}
@@ -76,7 +74,7 @@
{
input = "cd list[number=1]/contInList";
auto keys = std::map<std::string, std::string>{
- {"number", "1"}};
+ {"number", "1"}};
expected.m_path.m_nodes.push_back(listElement_("list", keys));
expected.m_path.m_nodes.push_back(container_("contInList"));
}
@@ -85,11 +83,10 @@
{
input = "cd twoKeyList[number=4 name=abcd]";
auto keys = std::map<std::string, std::string>{
- {"number", "4"},
- {"name", "abcd"}};
+ {"number", "4"},
+ {"name", "abcd"}};
expected.m_path.m_nodes.push_back(listElement_("twoKeyList", keys));
}
-
}
SECTION("whitespace handling")
@@ -144,7 +141,7 @@
{
SECTION("cd a garbage")
{
- input = "cd a garbage";
+ input = "cd a garbage";
}
SECTION("cd a/a2 garbage")
{