Skip to content

Commit d04cd7c

Browse files
Added comments to XML
1 parent f2f2f36 commit d04cd7c

3 files changed

Lines changed: 55 additions & 13 deletions

File tree

include/rfl/xml/Writer.hpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@
1010
#include "../always_false.hpp"
1111
#include "../common.hpp"
1212

13-
namespace rfl {
14-
namespace xml {
13+
namespace rfl ::xml {
1514

1615
struct RFL_API Writer {
1716
struct XMLOutputArray {
@@ -59,6 +58,12 @@ struct RFL_API Writer {
5958
const size_t _size,
6059
OutputObjectType* _parent) const;
6160

61+
void add_comment_to_array(const std::string_view& _comment,
62+
OutputArrayType* _parent) const;
63+
64+
void add_comment_to_object(const std::string_view& _comment,
65+
OutputObjectType* _parent) const;
66+
6267
OutputObjectType add_object_to_array(const size_t _size,
6368
OutputArrayType* _parent) const;
6469

@@ -95,7 +100,7 @@ struct RFL_API Writer {
95100
template <class T>
96101
decltype(auto) to_string(const T& _val) const {
97102
if constexpr (std::is_same<std::remove_cvref_t<T>, std::string>()) {
98-
return _val; // Return reference to avoid expensive string copy.
103+
return _val; // Return reference to avoid expensive string copy.
99104
} else if constexpr (std::is_same<std::remove_cvref_t<T>, bool>()) {
100105
return _val ? "true" : "false";
101106
} else if constexpr (std::is_floating_point<std::remove_cvref_t<T>>() ||
@@ -121,7 +126,6 @@ struct RFL_API Writer {
121126
std::string root_name_;
122127
};
123128

124-
} // namespace xml
125-
} // namespace rfl
129+
} // namespace rfl::xml
126130

127131
#endif // RFL_XML_WRITER_HPP_

src/rfl/xml/Writer.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,27 +38,23 @@ Writer::Writer(const Ref<pugi::xml_node>& _root, const std::string& _root_name)
3838
Writer::~Writer() = default;
3939

4040
Writer::OutputArrayType Writer::array_as_root(const size_t /*_size*/) const {
41-
auto node_child =
42-
Ref<pugi::xml_node>::make(root_->append_child(root_name_));
41+
auto node_child = Ref<pugi::xml_node>::make(root_->append_child(root_name_));
4342
return OutputArrayType(root_name_, node_child);
4443
}
4544

4645
Writer::OutputObjectType Writer::object_as_root(const size_t /*_size*/) const {
47-
auto node_child =
48-
Ref<pugi::xml_node>::make(root_->append_child(root_name_));
46+
auto node_child = Ref<pugi::xml_node>::make(root_->append_child(root_name_));
4947
return OutputObjectType(node_child);
5048
}
5149

5250
Writer::OutputVarType Writer::null_as_root() const {
53-
auto node_child =
54-
Ref<pugi::xml_node>::make(root_->append_child(root_name_));
51+
auto node_child = Ref<pugi::xml_node>::make(root_->append_child(root_name_));
5552
return OutputVarType(node_child);
5653
}
5754

5855
Writer::OutputVarType Writer::value_as_root_impl(
5956
const std::string& _str) const {
60-
auto node_child =
61-
Ref<pugi::xml_node>::make(root_->append_child(root_name_));
57+
auto node_child = Ref<pugi::xml_node>::make(root_->append_child(root_name_));
6258
node_child->append_child(pugi::node_pcdata).set_value(_str);
6359
return OutputVarType(node_child);
6460
}
@@ -74,6 +70,16 @@ Writer::OutputArrayType Writer::add_array_to_object(
7470
return OutputArrayType(_name, _parent->node_);
7571
}
7672

73+
void Writer::add_comment_to_array(const std::string_view& _comment,
74+
OutputArrayType* _parent) const {
75+
_parent->node_->append_child(pugi::node_comment).set_value(_comment);
76+
}
77+
78+
void Writer::add_comment_to_object(const std::string_view& _comment,
79+
OutputObjectType* _parent) const {
80+
_parent->node_->append_child(pugi::node_comment).set_value(_comment);
81+
}
82+
7783
Writer::OutputVarType Writer::add_value_to_array_impl(
7884
const std::string& _str, OutputArrayType* _parent) const {
7985
auto node_child =

tests/xml/test_comment.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include <rfl.hpp>
2+
#include <string>
3+
#include <vector>
4+
5+
#include "write_and_read.hpp"
6+
7+
namespace test_comment {
8+
9+
struct Person {
10+
std::string first_name;
11+
std::string last_name;
12+
rfl::Commented<std::string> town;
13+
};
14+
15+
TEST(xml, test_comment) {
16+
const auto homer = Person{.first_name = "Homer",
17+
.last_name = "Simpson",
18+
.town = rfl::Commented<std::string>(
19+
"Springfield", "The town where Homer lives")};
20+
21+
const auto xml_str = rfl::xml::write(homer);
22+
23+
EXPECT_EQ(xml_str, R"(<?xml version="1.0" encoding="UTF-8"?>
24+
<Person>
25+
<first_name>Homer</first_name>
26+
<last_name>Simpson</last_name>
27+
<town>Springfield</town>
28+
<!--The town where Homer lives-->
29+
</Person>
30+
)");
31+
}
32+
} // namespace test_comment

0 commit comments

Comments
 (0)