Skip to content

Commit ed6ad37

Browse files
committed
Add AdditionalFields functionality to PollBuilder
1 parent a8190bf commit ed6ad37

File tree

5 files changed

+102
-1
lines changed

5 files changed

+102
-1
lines changed

src/gridcoin/voting/builders.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,6 +1095,62 @@ PollBuilder PollBuilder::AddChoice(std::string label)
10951095
return std::move(*this);
10961096
}
10971097

1098+
PollBuilder PollBuilder::SetAdditionalFields(std::vector<Poll::AdditionalField> fields)
1099+
{
1100+
m_poll->m_additional_fields = Poll::AdditionalFieldList();
1101+
1102+
return AddAdditionalFields(std::move(fields));
1103+
}
1104+
1105+
PollBuilder PollBuilder::AddAdditionalFields(std::vector<Poll::AdditionalField> fields)
1106+
{
1107+
for (auto& field : fields) {
1108+
*this = AddAdditionalField(std::move(field));
1109+
}
1110+
1111+
return std::move(*this);
1112+
}
1113+
1114+
PollBuilder PollBuilder::AddAdditionalField(Poll::AdditionalField field)
1115+
{
1116+
// Make sure there are no leading and trailing spaces.
1117+
field.m_name = TrimString(field.m_name);
1118+
field.m_value = TrimString(field.m_value);
1119+
1120+
if (!field.WellFormed()) {
1121+
throw VotingError(_("The field is not well-formed."));
1122+
}
1123+
1124+
if (m_poll->m_additional_fields.size() + 1 > POLL_MAX_ADDITIONAL_FIELDS_SIZE) {
1125+
throw VotingError(strprintf(
1126+
_("Poll cannot contain more than %s additional fields"),
1127+
ToString(POLL_MAX_ADDITIONAL_FIELDS_SIZE)));
1128+
}
1129+
1130+
if (field.m_name.size() > Poll::AdditionalField::MAX_N_OR_V_SIZE) {
1131+
throw VotingError(strprintf(
1132+
_("Poll additional field name \"%s\" exceeds %s characters."),
1133+
field.m_name,
1134+
ToString(Poll::AdditionalField::MAX_N_OR_V_SIZE)));
1135+
}
1136+
1137+
if (field.m_value.size() > Poll::AdditionalField::MAX_N_OR_V_SIZE) {
1138+
throw VotingError(strprintf(
1139+
_("Poll additional field value \"%s\" for field name \"%s\" exceeds %s characters."),
1140+
field.m_value,
1141+
field.m_name,
1142+
ToString(Poll::AdditionalField::MAX_N_OR_V_SIZE)));
1143+
}
1144+
1145+
if (m_poll->m_additional_fields.FieldExists(field.m_name)) {
1146+
throw VotingError(strprintf(_("Duplicate poll additional field: %s"), field.m_name));
1147+
}
1148+
1149+
m_poll->m_additional_fields.Add(std::move(field));
1150+
1151+
return std::move(*this);
1152+
}
1153+
10981154
CWalletTx PollBuilder::BuildContractTx(CWallet* const pwallet)
10991155
{
11001156
if (!pwallet) {

src/gridcoin/voting/builders.h

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#ifndef GRIDCOIN_VOTING_BUILDERS_H
66
#define GRIDCOIN_VOTING_BUILDERS_H
77

8-
#include "gridcoin/voting/fwd.h"
8+
#include "gridcoin/voting/poll.h"
99

1010
#include <memory>
1111
#include <vector>
@@ -166,6 +166,36 @@ class PollBuilder
166166
//!
167167
PollBuilder AddChoice(std::string label);
168168

169+
//!
170+
//! \brief Set the set of additional fields for the poll.
171+
//!
172+
//! \param labels A set of AdditionalFields to set.
173+
//!
174+
//! \throws VotingError If any of the fields are malformed, or if the set of fields
175+
//! contains a duplicate label.
176+
//!
177+
PollBuilder SetAdditionalFields(std::vector<Poll::AdditionalField> fields);
178+
179+
//!
180+
//! \brief Add a set of additional fields for the poll.
181+
//!
182+
//! \param labels A set of AdditionalFields to add.
183+
//!
184+
//! \throws VotingError If any of the fields are malformed, or if the set of fields
185+
//! contains a duplicate label.
186+
//!
187+
PollBuilder AddAdditionalFields(std::vector<Poll::AdditionalField> fields);
188+
189+
//!
190+
//! \brief Add an additional field for the poll.
191+
//!
192+
//! \param AdditionalField The additional field name-value to add.
193+
//!
194+
//! \throws VotingError If the field is malformed, or if the set of fields
195+
//! contains a duplicate label.
196+
//!
197+
PollBuilder AddAdditionalField(Poll::AdditionalField field);
198+
169199
//!
170200
//! \brief Generate a poll contract transaction with the constructed poll.
171201
//!

src/gridcoin/voting/fwd.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ constexpr CAmount POLL_REQUIRED_BALANCE = 100000 * COIN;
2929
//!
3030
constexpr size_t POLL_MAX_CHOICES_SIZE = 20;
3131

32+
//!
33+
//! \brief The maximum number of additional fields that a poll can contain.
34+
//!
35+
constexpr size_t POLL_MAX_ADDITIONAL_FIELDS_SIZE = 16;
36+
3237
//!
3338
//! \brief Describes the poll types.
3439
//!

src/gridcoin/voting/poll.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,11 @@ void AdditionalFieldList::Add(std::string name, std::string value, bool required
422422
m_additional_fields.emplace_back(std::move(additional_field));
423423
}
424424

425+
void AdditionalFieldList::Add(AdditionalField field)
426+
{
427+
m_additional_fields.emplace_back(std::move(field));
428+
}
429+
425430
// -----------------------------------------------------------------------------
426431
// Class: Poll::ChoiceList
427432
// -----------------------------------------------------------------------------

src/gridcoin/voting/poll.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,11 @@ class Poll
334334
//!
335335
void Add(std::string name, std::string value, bool required);
336336

337+
//!
338+
//! \brief Add an additional field to the poll.
339+
//!
340+
void Add(AdditionalField field);
341+
337342
ADD_SERIALIZE_METHODS;
338343

339344
template <typename Stream, typename Operation>

0 commit comments

Comments
 (0)