split ast definitions into more files

Also move pathToString definitions into the new files

Change-Id: I08b92ed108392825ec87af1f2b8a49205265dd47
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9e21d4f..4ec7140 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -57,7 +57,8 @@
 set(parser_SRCS
     src/schema.cpp
     src/parser.cpp
-    src/ast.cpp
+    src/ast_commands.cpp
+    src/ast_path.cpp
     src/utils.cpp
     src/parser_context.cpp
     src/interpreter.cpp
diff --git a/src/ast.cpp b/src/ast.cpp
deleted file mode 100644
index 35bf1cb..0000000
--- a/src/ast.cpp
+++ /dev/null
@@ -1,67 +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 "ast.hpp"
-
-
-container_::container_(const std::string& name)
-    : m_name(name)
-{
-}
-
-bool container_::operator==(const container_& b) const
-{
-    return this->m_name == b.m_name;
-}
-
-leaf_::leaf_(const std::string& name)
-    : m_name(name)
-{
-}
-
-bool leaf_::operator==(const leaf_& b) const
-{
-    return this->m_name == b.m_name;
-}
-
-listElement_::listElement_(const std::string& listName, const std::map<std::string, std::string>& keys)
-    : m_name(listName)
-    , m_keys(keys)
-{
-}
-
-bool listElement_::operator==(const listElement_& b) const
-{
-    return (this->m_name == b.m_name && this->m_keys == b.m_keys);
-}
-
-bool path_::operator==(const path_& b) const
-{
-    if (this->m_nodes.size() != b.m_nodes.size())
-        return false;
-    return this->m_nodes == b.m_nodes;
-}
-
-bool set_::operator==(const set_& b) const
-{
-    return this->m_path == b.m_path && this->m_data == b.m_data;
-}
-
-bool cd_::operator==(const cd_& b) const
-{
-    return this->m_path == b.m_path;
-}
-
-bool create_::operator==(const create_& b) const
-{
-    return this->m_path == b.m_path;
-}
-
-bool delete_::operator==(const delete_& b) const
-{
-    return this->m_path == b.m_path;
-}
diff --git a/src/ast.hpp b/src/ast.hpp
deleted file mode 100644
index 9638684..0000000
--- a/src/ast.hpp
+++ /dev/null
@@ -1,117 +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>
- *
-*/
-#pragma once
-#include <boost/spirit/home/x3.hpp>
-#include <boost/spirit/home/x3/support/ast/position_tagged.hpp>
-#include <boost/spirit/home/x3/support/utility/error_reporting.hpp>
-
-#include <boost/fusion/adapted/struct/adapt_struct.hpp>
-#include <boost/fusion/include/adapt_struct.hpp>
-#include <boost/fusion/include/std_pair.hpp>
-#include <boost/variant.hpp>
-#include <map>
-#include <vector>
-
-#include "utils.hpp"
-namespace x3 = boost::spirit::x3;
-namespace ascii = boost::spirit::x3::ascii;
-
-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<<;
-
-
-using keyValue_ = std::pair<std::string, std::string>;
-
-
-struct parser_context_tag;
-
-
-struct nodeup_ {
-    bool operator==(const nodeup_&) const
-    {
-        return true;
-    }
-};
-
-struct container_ {
-    container_() = default;
-    container_(const std::string& name);
-
-    bool operator==(const container_& b) const;
-
-    std::string m_name;
-};
-
-struct leaf_ {
-    leaf_() = default;
-    leaf_(const std::string& name);
-
-    bool operator==(const leaf_& b) const;
-
-    std::string m_name;
-};
-
-
-struct list_ {
-    std::vector<std::string> m_keys;
-};
-
-struct listElement_ {
-    listElement_() {}
-    listElement_(const std::string& listName, const std::map<std::string, std::string>& keys);
-
-    bool operator==(const listElement_& b) const;
-
-    std::string m_name;
-    std::map<std::string, std::string> m_keys;
-};
-
-
-struct path_ {
-    bool operator==(const path_& b) const;
-    std::vector<boost::variant<container_, listElement_, nodeup_, leaf_>> m_nodes;
-};
-
-
-struct cd_ : x3::position_tagged {
-    bool operator==(const cd_& b) const;
-    path_ m_path;
-};
-
-struct create_ : x3::position_tagged {
-    bool operator==(const create_& b) const;
-    path_ m_path;
-};
-
-struct delete_ : x3::position_tagged {
-    bool operator==(const delete_& b) const;
-    path_ m_path;
-};
-
-struct set_ : x3::position_tagged {
-    bool operator==(const set_& b) const;
-    path_ m_path;
-    std::string m_data;
-};
-
-using command_ = boost::variant<cd_, create_, delete_, set_>;
-
-BOOST_FUSION_ADAPT_STRUCT(container_, m_name)
-BOOST_FUSION_ADAPT_STRUCT(listElement_, m_name, m_keys)
-BOOST_FUSION_ADAPT_STRUCT(path_, m_nodes)
-BOOST_FUSION_ADAPT_STRUCT(cd_, m_path)
-BOOST_FUSION_ADAPT_STRUCT(create_, m_path)
-BOOST_FUSION_ADAPT_STRUCT(delete_, m_path)
-BOOST_FUSION_ADAPT_STRUCT(set_, m_path, m_data)
diff --git a/src/ast_commands.cpp b/src/ast_commands.cpp
new file mode 100644
index 0000000..a8b481d
--- /dev/null
+++ b/src/ast_commands.cpp
@@ -0,0 +1,29 @@
+/*
+ * 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 "ast_commands.hpp"
+
+
+bool set_::operator==(const set_& b) const
+{
+    return this->m_path == b.m_path && this->m_data == b.m_data;
+}
+
+bool cd_::operator==(const cd_& b) const
+{
+    return this->m_path == b.m_path;
+}
+
+bool create_::operator==(const create_& b) const
+{
+    return this->m_path == b.m_path;
+}
+
+bool delete_::operator==(const delete_& b) const
+{
+    return this->m_path == b.m_path;
+}
diff --git a/src/ast_commands.hpp b/src/ast_commands.hpp
new file mode 100644
index 0000000..5caeb2e
--- /dev/null
+++ b/src/ast_commands.hpp
@@ -0,0 +1,54 @@
+/*
+ * 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>
+ *
+*/
+#pragma once
+
+#include "ast_path.hpp"
+
+namespace x3 = boost::spirit::x3;
+namespace ascii = boost::spirit::x3::ascii;
+
+using ascii::space;
+using x3::_attr;
+using x3::alnum;
+using x3::alpha;
+using x3::char_;
+using x3::expect;
+using x3::lexeme;
+using x3::lit;
+
+struct parser_context_tag;
+
+using keyValue_ = std::pair<std::string, std::string>;
+
+struct cd_ : x3::position_tagged {
+    bool operator==(const cd_& b) const;
+    path_ m_path;
+};
+
+struct create_ : x3::position_tagged {
+    bool operator==(const create_& b) const;
+    path_ m_path;
+};
+
+struct delete_ : x3::position_tagged {
+    bool operator==(const delete_& b) const;
+    path_ m_path;
+};
+
+struct set_ : x3::position_tagged {
+    bool operator==(const set_& b) const;
+    path_ m_path;
+    std::string m_data;
+};
+
+using command_ = boost::variant<cd_, create_, delete_, set_>;
+
+BOOST_FUSION_ADAPT_STRUCT(cd_, m_path)
+BOOST_FUSION_ADAPT_STRUCT(create_, m_path)
+BOOST_FUSION_ADAPT_STRUCT(delete_, m_path)
+BOOST_FUSION_ADAPT_STRUCT(set_, m_path, m_data)
diff --git a/src/ast_path.cpp b/src/ast_path.cpp
new file mode 100644
index 0000000..2d2c600
--- /dev/null
+++ b/src/ast_path.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 <experimental/iterator>
+#include "ast_path.hpp"
+#include "utils.hpp"
+
+container_::container_(const std::string& name)
+    : m_name(name)
+{
+}
+
+bool container_::operator==(const container_& b) const
+{
+    return this->m_name == b.m_name;
+}
+
+leaf_::leaf_(const std::string& name)
+    : m_name(name)
+{
+}
+
+bool leaf_::operator==(const leaf_& b) const
+{
+    return this->m_name == b.m_name;
+}
+
+listElement_::listElement_(const std::string& listName, const std::map<std::string, std::string>& keys)
+    : m_name(listName)
+    , m_keys(keys)
+{
+}
+
+bool listElement_::operator==(const listElement_& b) const
+{
+    return (this->m_name == b.m_name && this->m_keys == b.m_keys);
+}
+
+bool path_::operator==(const path_& b) const
+{
+    if (this->m_nodes.size() != b.m_nodes.size())
+        return false;
+    return this->m_nodes == b.m_nodes;
+}
+
+
+struct nodeToSchemaString : public boost::static_visitor<std::string> {
+    std::string operator()(const nodeup_&) const
+    {
+        return "..";
+    }
+    template <class T>
+    std::string operator()(const T& node) const
+    {
+        return node.m_name;
+    }
+};
+struct nodeToDataString : public boost::static_visitor<std::string> {
+    std::string operator()(const listElement_& node) const
+    {
+        std::ostringstream res;
+        res << node.m_name + "[";
+        std::transform(node.m_keys.begin(), node.m_keys.end(),
+                std::experimental::make_ostream_joiner(res, ' '),
+                [] (const auto& it) { return it.first + "=" + it.second; });
+        res << "]";
+    return res.str();
+    }
+    std::string operator()(const nodeup_&) const
+    {
+        return "..";
+    }
+    template <class T>
+    std::string operator()(const T& node) const
+    {
+        return node.m_name;
+    }
+};
+
+std::string pathToDataString(const path_& path)
+{
+    std::string res;
+    for (const auto it : path.m_nodes)
+        res = joinPaths(res, boost::apply_visitor(nodeToDataString(), it));
+    return res;
+}
+
+std::string pathToSchemaString(const path_& path)
+{
+    std::string res;
+    for (const auto it : path.m_nodes)
+        res = joinPaths(res, boost::apply_visitor(nodeToSchemaString(), it));
+    return res;
+}
diff --git a/src/ast_path.hpp b/src/ast_path.hpp
new file mode 100644
index 0000000..1a4b282
--- /dev/null
+++ b/src/ast_path.hpp
@@ -0,0 +1,67 @@
+/*
+ * 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>
+ *
+*/
+#pragma once
+
+#include <boost/spirit/home/x3.hpp>
+#include <boost/spirit/home/x3/support/ast/position_tagged.hpp>
+#include <boost/spirit/home/x3/support/utility/error_reporting.hpp>
+
+#include <boost/fusion/adapted/struct/adapt_struct.hpp>
+#include <boost/fusion/include/adapt_struct.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+#include <boost/variant.hpp>
+#include <map>
+#include <vector>
+
+struct nodeup_ {
+    bool operator==(const nodeup_&) const
+    {
+        return true;
+    }
+};
+
+struct container_ {
+    container_() = default;
+    container_(const std::string& name);
+
+    bool operator==(const container_& b) const;
+
+    std::string m_name;
+};
+
+struct leaf_ {
+    leaf_() = default;
+    leaf_(const std::string& name);
+
+    bool operator==(const leaf_& b) const;
+
+    std::string m_name;
+};
+
+struct listElement_ {
+    listElement_() {}
+    listElement_(const std::string& listName, const std::map<std::string, std::string>& keys);
+
+    bool operator==(const listElement_& b) const;
+
+    std::string m_name;
+    std::map<std::string, std::string> m_keys;
+};
+
+struct path_ {
+    bool operator==(const path_& b) const;
+    std::vector<boost::variant<container_, listElement_, nodeup_, leaf_>> m_nodes;
+};
+
+
+std::string pathToDataString(const path_& path);
+std::string pathToSchemaString(const path_& path);
+
+BOOST_FUSION_ADAPT_STRUCT(container_, m_name)
+BOOST_FUSION_ADAPT_STRUCT(listElement_, m_name, m_keys)
+BOOST_FUSION_ADAPT_STRUCT(path_, m_nodes)
diff --git a/src/grammars.hpp b/src/grammars.hpp
index 9e4ea35..937fd3c 100644
--- a/src/grammars.hpp
+++ b/src/grammars.hpp
@@ -8,7 +8,7 @@
 
 #pragma once
 
-#include "ast.hpp"
+#include "ast_commands.hpp"
 #include "ast_handlers.hpp"
 
 
diff --git a/src/parser.cpp b/src/parser.cpp
index f26b164..e2d0330 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -5,7 +5,6 @@
  * Written by Václav Kubernát <kubervac@fit.cvut.cz>
  *
 */
-#include <experimental/iterator>
 #include <ostream>
 #include "parser.hpp"
 
@@ -19,28 +18,6 @@
 {
 }
 
-struct nodeToDataString : public boost::static_visitor<std::string> {
-    std::string operator()(const listElement_& node) const
-    {
-        std::ostringstream res;
-        res << node.m_name + "[";
-        std::transform(node.m_keys.begin(), node.m_keys.end(),
-                       std::experimental::make_ostream_joiner(res, ' '),
-                       [] (const auto& it) { return it.first + "=" + it.second; });
-        res << "]";
-        return res.str();
-    }
-    std::string operator()(const nodeup_&) const
-    {
-        return "..";
-    }
-    template <class T>
-    std::string operator()(const T& node) const
-    {
-        return node.m_name;
-    }
-};
-
 command_ Parser::parseCommand(const std::string& line, std::ostream& errorStream)
 {
     command_ parsedCommand;
@@ -74,10 +51,5 @@
 
 std::string Parser::currentNode() const
 {
-    std::string res;
-    for (const auto& it : m_curDir.m_nodes) {
-        res = joinPaths(res, boost::apply_visitor(nodeToDataString(), it));
-    }
-
-    return res;
+    return pathToDataString(m_curDir);
 }
diff --git a/src/schema.cpp b/src/schema.cpp
index 9832c45..95cd4ae 100644
--- a/src/schema.cpp
+++ b/src/schema.cpp
@@ -11,26 +11,6 @@
 
 InvalidNodeException::~InvalidNodeException() = default;
 
-struct nodeToSchemaString : public boost::static_visitor<std::string> {
-    std::string operator()(const nodeup_&) const
-    {
-        return "..";
-    }
-    template <class T>
-    std::string operator()(const T& node) const
-    {
-        return node.m_name;
-    }
-};
-
-std::string pathToString(const path_& path)
-{
-    std::string res;
-    for (const auto it : path.m_nodes)
-        res = joinPaths(res, boost::apply_visitor(nodeToSchemaString(), it));
-    return res;
-}
-
 Schema::Schema()
 {
     m_nodes.emplace("", std::unordered_map<std::string, NodeType>());
@@ -52,7 +32,7 @@
 
 bool Schema::isContainer(const path_& location, const std::string& name) const
 {
-    std::string locationString = pathToString(location);
+    std::string locationString = pathToSchemaString(location);
     if (!nodeExists(locationString, name))
         return false;
 
@@ -71,7 +51,7 @@
 
 bool Schema::listHasKey(const path_& location, const std::string& name, const std::string& key) const
 {
-    std::string locationString = pathToString(location);
+    std::string locationString = pathToSchemaString(location);
     assert(isList(location, name));
 
     const auto& child = children(locationString).at(name);
@@ -81,7 +61,7 @@
 
 const std::set<std::string>& Schema::listKeys(const path_& location, const std::string& name) const
 {
-    std::string locationString = pathToString(location);
+    std::string locationString = pathToSchemaString(location);
     assert(isList(location, name));
 
     const auto& child = children(locationString).at(name);
@@ -91,7 +71,7 @@
 
 bool Schema::isList(const path_& location, const std::string& name) const
 {
-    std::string locationString = pathToString(location);
+    std::string locationString = pathToSchemaString(location);
     if (!nodeExists(locationString, name))
         return false;
     const auto& child = children(locationString).at(name);
@@ -112,7 +92,7 @@
 {
     if (!isContainer(location, name))
         return false;
-    std::string locationString = pathToString(location);
+    std::string locationString = pathToSchemaString(location);
     return boost::get<yang::container>(children(locationString).at(name)).m_presence == yang::ContainerTraits::Presence;
 }
 
@@ -123,7 +103,7 @@
 
 bool Schema::isLeaf(const path_& location, const std::string& name) const
 {
-    std::string locationString = pathToString(location);
+    std::string locationString = pathToSchemaString(location);
     if (!nodeExists(locationString, name))
         return false;
 
diff --git a/src/schema.hpp b/src/schema.hpp
index 487f820..73e89df 100644
--- a/src/schema.hpp
+++ b/src/schema.hpp
@@ -12,7 +12,7 @@
 #include <set>
 #include <stdexcept>
 #include <unordered_map>
-#include "ast.hpp"
+#include "ast_path.hpp"
 
 namespace yang {
 enum class ContainerTraits {
diff --git a/tests/cd.cpp b/tests/cd.cpp
index 2cef615..8fe30ad 100644
--- a/tests/cd.cpp
+++ b/tests/cd.cpp
@@ -7,7 +7,7 @@
 */
 
 #include "trompeloeil_catch.h"
-#include "ast.hpp"
+#include "ast_commands.hpp"
 #include "parser.hpp"
 #include "schema.hpp"
 
diff --git a/tests/leaf_editing.cpp b/tests/leaf_editing.cpp
index e31a73f..5894921 100644
--- a/tests/leaf_editing.cpp
+++ b/tests/leaf_editing.cpp
@@ -7,7 +7,7 @@
 */
 
 #include "trompeloeil_catch.h"
-#include "ast.hpp"
+#include "ast_commands.hpp"
 #include "parser.hpp"
 #include "schema.hpp"
 
diff --git a/tests/presence_containers.cpp b/tests/presence_containers.cpp
index a4050f8..72c9daf 100644
--- a/tests/presence_containers.cpp
+++ b/tests/presence_containers.cpp
@@ -8,7 +8,7 @@
 */
 
 #include "trompeloeil_catch.h"
-#include "ast.hpp"
+#include "ast_commands.hpp"
 #include "parser.hpp"
 #include "schema.hpp"